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

Artifact c67a3bf1c185ff05937a9e3a01b8a6981f5a6add8da93911f461d59e57eea8d5:


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 72 6f 77  of the first row
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 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5aa0: 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f 72  Retrieve a recor
5ab0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
5ac0: 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
5ad0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5ae0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
5af0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
5b00: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a   left in the .**
5b10: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
5b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  t..*/.static Fts
5b30: 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52  5Data *fts5DataR
5b40: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
5b50: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
5b60: 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20   Fts5Data *pRet 
5b70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
5b80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5b90: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
5ba0: 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20  TE_OK;..    if( 
5bb0: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
5bc0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
5bd0: 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
5be0: 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72  TE_ABORT if ther
5bf0: 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61 76  e has been a sav
5c00: 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  epoint.      ** 
5c10: 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69  rollback since i
5c20: 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
5c30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 20   In this case a 
5c40: 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a  new blob handle.
5c50: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
5c60: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
5c70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
5c80: 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65 72  lob = p->pReader
5c90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64  ;.      p->pRead
5ca0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  er = 0;.      rc
5cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
5cc0: 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52  reopen(pBlob, iR
5cd0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73  owid);.      ass
5ce0: 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d  ert( p->pReader=
5cf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 );.      p->p
5d00: 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a  Reader = pBlob;.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5d20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5d30: 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
5d40: 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(p);.      }. 
5d50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
5d60: 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20 3d  ITE_ABORT ) rc =
5d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5d80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
5d90: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20   blob handle is 
5da0: 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69 73  not open at this
5db0: 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20   point, open it 
5dc0: 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a  and seek .    **
5dd0: 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65   to the requeste
5de0: 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20  d entry.  */.   
5df0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
5e00: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
5e10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73  _OK ){.      Fts
5e20: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
5e30: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
5e40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5e50: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
5e60: 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20  fig->db, .      
5e70: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
5e80: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22  , p->zDataTbl, "
5e90: 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20  block", iRowid, 
5ea0: 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20  0, &p->pReader. 
5eb0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
5ec0: 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
5ed0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  of the sqlite3_b
5ee0: 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  lob_open() or sq
5ef0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5f00: 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  n() calls.    **
5f10: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20   above returned 
5f20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65  SQLITE_ERROR, re
5f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
5f40: 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64  UPT_VTAB instead
5f50: 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65  ..    ** All the
5f60: 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66   reasons those f
5f70: 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72  unctions might r
5f80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5f90: 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20  OR - missing.   
5fa0: 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69   ** table, missi
5fb0: 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62  ng row, non-blob
5fc0: 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63  /text in block c
5fd0: 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65  olumn - indicate
5fe0: 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67   .    ** backing
5ff0: 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f   store corruptio
6000: 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  n.  */.    if( r
6010: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
6020: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
6030: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
6040: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6050: 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20       u8 *aOut = 
6060: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6070: 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61   /* Read blob da
6080: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  ta into this buf
6090: 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  fer */.      int
60a0: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
60b0: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
60c0: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
60d0: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65  nt nAlloc = size
60e0: 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e  of(Fts5Data) + n
60f0: 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54 41  Byte + FTS5_DATA
6100: 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PADDING;.      
6110: 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61  pRet = (Fts5Data
6120: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6130: 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  (nAlloc);.      
6140: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
6150: 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e      pRet->nn = n
6160: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61 4f  Byte;.        aO
6170: 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28  ut = pRet->p = (
6180: 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20  u8*)&pRet[1];.  
6190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
61b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OMEM;.      }.. 
61c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
61d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
61e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
61f0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61  lob_read(p->pRea
6200: 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65  der, aOut, nByte
6210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6220: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
6250: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  et);.        pRe
6260: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
6270: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
6280: 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20 2a  ODO1: Fix this *
6290: 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  /.        pRet->
62a0: 70 5b 6e 42 79 74 65 5d 20 3d 20 30 78 30 30 3b  p[nByte] = 0x00;
62b0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73  .        pRet->s
62c0: 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
62d0: 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b  16(&pRet->p[2]);
62e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
62f0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
6300: 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20     p->nRead++;. 
6310: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
6320: 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21  Ret==0)==(p->rc!
6330: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20  =SQLITE_OK) );. 
6340: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
6350: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6360: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61   reference to da
6370: 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e  ta record return
6380: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
6390: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35   call to.** fts5
63a0: 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73  DataRead()..*/.s
63b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
63c0: 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44  ataRelease(Fts5D
63d0: 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73  ata *pData){.  s
63e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
63f0: 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74  a);.}..static Ft
6400: 73 35 44 61 74 61 20 2a 66 74 73 35 4c 65 61 66  s5Data *fts5Leaf
6410: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
6420: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
6430: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
6440: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
6450: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  p, iRowid);.  if
6460: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 66  ( pRet ){.    if
6470: 28 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70  ( pRet->szLeaf>p
6480: 52 65 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  Ret->nn ){.     
6490: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
64a0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 66 74 73  RRUPT;.      fts
64b0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 52 65  5DataRelease(pRe
64c0: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
64d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
64e0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
64f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
6500: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6510: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
6520: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
6530: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
6540: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20   *zSql.){.  if( 
6550: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6560: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
6570: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6580: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6590: 65 5f 76 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v3(p->pConfig-
65a0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20  >db, zSql, -1,. 
65b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
65c0: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
65d0: 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  NT|SQLITE_PREPAR
65e0: 45 5f 4e 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20  E_NO_VTAB,.     
65f0: 20 20 20 20 20 70 70 53 74 6d 74 2c 20 30 29 3b       ppStmt, 0);
6600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6610: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
6620: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
6630: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
6640: 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zSql);.  return
6650: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   p->rc;.}.../*.*
6660: 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c  * INSERT OR REPL
6670: 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ACE a record int
6680: 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  o the %_data tab
6690: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
66a0: 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74 65  id fts5DataWrite
66b0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
66c0: 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74  64 iRowid, const
66d0: 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
66e0: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d  nData){.  if( p-
66f0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6700: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
6710: 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b  p->pWriter==0 ){
6720: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6730: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6740: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6750: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6760: 70 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  p, &p->pWriter, 
6770: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6780: 0a 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c  .          "REPL
6790: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
67a0: 71 5f 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63  q_data'(id, bloc
67b0: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
67c0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
67d0: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
67e0: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
67f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
6800: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
6810: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6820: 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31  64(p->pWriter, 1
6830: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  , iRowid);.  sql
6840: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
6850: 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44  ->pWriter, 2, pD
6860: 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49  ata, nData, SQLI
6870: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
6880: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57  lite3_step(p->pW
6890: 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  riter);.  p->rc 
68a0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
68b0: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 73  p->pWriter);.  s
68c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
68d0: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 29 3b  (p->pWriter, 2);
68e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
68f0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6900: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6910: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
6920: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
6930: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
6940: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
6950: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
6960: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
6970: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6980: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6990: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
69a0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
69b0: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
69c0: 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
69d0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
69e0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
69f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
6a00: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6a10: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6a20: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20   '%q'.'%q_data' 
6a30: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
6a40: 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20  id<=?", .       
6a50: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6a60: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6a70: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 66      );.    if( f
6a80: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6a90: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65  tmt(p, &p->pDele
6aa0: 74 65 72 2c 20 7a 53 71 6c 29 20 29 20 72 65 74  ter, zSql) ) ret
6ab0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  urn;.  }..  sqli
6ac0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6ad0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
6ae0: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
6af0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6b00: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
6b10: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
6b20: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
6b30: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6b40: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
6b50: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
6b60: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f   Remove all reco
6b70: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
6b80: 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67  ith segment iSeg
6b90: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
6ba0: 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76  id fts5DataRemov
6bb0: 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64  eSegment(Fts5Ind
6bc0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69  ex *p, int iSegi
6bd0: 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74  d){.  i64 iFirst
6be0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
6bf0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29  ROWID(iSegid, 0)
6c00: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
6c10: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6c20: 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d  ID(iSegid+1, 0)-
6c30: 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c  1;.  fts5DataDel
6c40: 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69  ete(p, iFirst, i
6c50: 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Last);.  if( p->
6c60: 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29  pIdxDeleter==0 )
6c70: 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
6c80: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6c90: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
6ca0: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6cb0: 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65  (p, &p->pIdxDele
6cc0: 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ter, sqlite3_mpr
6cd0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
6ce0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
6cf0: 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
6d00: 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20   segid=?",.     
6d10: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6d20: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6d30: 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
6d40: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6d60: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
6d70: 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20  pIdxDeleter, 1, 
6d80: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  iSegid);.    sql
6d90: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
6da0: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70  xDeleter);.    p
6db0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6dc0: 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65  eset(p->pIdxDele
6dd0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
6de0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6df0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
6e00: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
6e10: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
6e20: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
6e30: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
6e40: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
6e50: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
6e60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6e70: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
6e80: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
6e90: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ea0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
6eb0: 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e   0>=(--pStruct->
6ec0: 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74  nRef) ){.    int
6ed0: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
6ee0: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30  pStruct->nRef==0
6ef0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
6f00: 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
6f10: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
6f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6f30: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
6f40: 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aSeg);.    }.   
6f50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6f60: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  truct);.  }.}..s
6f70: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
6f80: 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35  tructureRef(Fts5
6f90: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
6fa0: 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e  ct){.  pStruct->
6fb0: 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nRef++;.}../*.**
6fc0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   Deserialize and
6fd0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
6fe0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72  cture record cur
6ff0: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
7000: 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66   serialized.** f
7010: 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65  orm within buffe
7020: 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a  r pData/nData..*
7030: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
7040: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
7050: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
7060: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
7070: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
7080: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62  over-allocated b
7090: 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73  y one slot. This
70a0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75   allows the stru
70b0: 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  cture contents.*
70c0: 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73  * to be more eas
70d0: 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a  ily edited..**.*
70e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
70f0: 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20  curs, *ppOut is 
7100: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
7110: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7120: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
7130: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70  . Otherwise, *pp
7140: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
7150: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
7160: 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c  bject and.** SQL
7170: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
7180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7190: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
71a0: 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  de(.  const u8 *
71b0: 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
71c0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
71d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61  containing seria
71e0: 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20  lized structure 
71f0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7220: 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20  buffer pData in 
7230: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
7240: 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20  piCookie,       
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7260: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
7270: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  ie value */.  Ft
7280: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7290: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
72a0: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
72b0: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
72c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
72d0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
72e0: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
72f0: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
7300: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7310: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
7320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7330: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7340: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
7350: 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a  cate at pRet */.
7360: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7370: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7380: 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
7390: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
73a0: 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  */..  /* Grab th
73b0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  e cookie value *
73c0: 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65  /.  if( piCookie
73d0: 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73   ) *piCookie = s
73e0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
73f0: 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b  pData);.  i = 4;
7400: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
7410: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7420: 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65  levels and segme
7430: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
7440: 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
7450: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
7460: 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35    */.  i += fts5
7470: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7480: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
7490: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
74a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
74b0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69  , nSegment);.  i
74c0: 66 28 20 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d  f( nLevel>FTS5_M
74d0: 41 58 5f 53 45 47 4d 45 4e 54 20 7c 7c 20 6e 53  AX_SEGMENT || nS
74e0: 65 67 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58 5f  egment>FTS5_MAX_
74f0: 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 72  SEGMENT ){.    r
7500: 65 74 75 72 6e 20 46 54 53 35 5f 43 4f 52 52 55  eturn FTS5_CORRU
7510: 50 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  PT;.  }.  nByte 
7520: 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  = (.      sizeof
7530: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7540: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7550: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7560: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7570: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7580: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7590: 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c  evel-1)    /* aL
75a0: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
75b0: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
75c0: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
75d0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
75e0: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
75f0: 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ..  if( pRet ){.
7600: 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d      pRet->nRef =
7610: 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c   1;.    pRet->nL
7620: 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20  evel = nLevel;. 
7630: 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e     pRet->nSegmen
7640: 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  t = nSegment;.  
7650: 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
7660: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
7670: 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57  ta[i], &pRet->nW
7680: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20  riteCounter);.. 
7690: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72     for(iLvl=0; r
76a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
76b0: 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76  iLvl<nLevel; iLv
76c0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
76d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
76e0: 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c  pLvl = &pRet->aL
76f0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
7700: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30    int nTotal = 0
7710: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
7720: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  ;..      if( i>=
7730: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
7740: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
7750: 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
7760: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74  .        i += ft
7770: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7780: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7790: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20  Merge);.        
77a0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
77b0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
77c0: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20  nTotal);.       
77d0: 20 69 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76 6c   if( nTotal<pLvl
77e0: 2d 3e 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20  ->nMerge ) rc = 
77f0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
7800: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67        pLvl->aSeg
7810: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7820: 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65  eSegment*)sqlite
7830: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
7840: 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20  &rc, .          
7850: 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f    nTotal * sizeo
7860: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7870: 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 20  egment).        
7880: 29 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 67 6d  );.        nSegm
7890: 65 6e 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a 20  ent -= nTotal;. 
78a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
78b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
78c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  ){.        pLvl-
78d0: 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a  >nSeg = nTotal;.
78e0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
78f0: 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b  =0; iSeg<nTotal;
7900: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
7910: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
7920: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
7930: 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
7940: 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  g];.          if
7950: 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20  ( i>=nData ){.  
7960: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46            rc = F
7970: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
7980: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7990: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
79a0: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
79b0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
79c0: 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65 67  a[i], pSeg->iSeg
79d0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
79e0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
79f0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7a00: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg->pgnoFirst);
7a10: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7a20: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7a30: 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65 67 2d  &pData[i], pSeg-
7a40: 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20  >pgnoLast);.    
7a50: 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
7a60: 70 67 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e 70  pgnoLast<pSeg->p
7a70: 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20  gnoFirst ){.    
7a80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
7a90: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7aa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7ab0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ac0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7ad0: 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 67 6d 65  }.    if( nSegme
7ae0: 6e 74 21 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  nt!=0 && rc==SQL
7af0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54  ITE_OK ) rc = FT
7b00: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20  S5_CORRUPT;..   
7b10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7b20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  OK ){.      fts5
7b30: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
7b40: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52  (pRet);.      pR
7b50: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  et = 0;.    }.  
7b60: 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52  }..  *ppOut = pR
7b70: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  et;.  return rc;
7b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .}../*.**.*/.sta
7b90: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
7ba0: 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69  uctureAddLevel(i
7bb0: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72  nt *pRc, Fts5Str
7bc0: 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
7bd0: 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t){.  if( *pRc==
7be0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7bf0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7c00: 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
7c10: 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  uct;.    int nLe
7c20: 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  vel = pStruct->n
7c30: 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e  Level;.    int n
7c40: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  Byte = (.       
7c50: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7c60: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7c80: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7c90: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
7ca0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7cb0: 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20  ) * (nLevel+1)  
7cc0: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7cd0: 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20  y */.    );..   
7ce0: 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74   pStruct = sqlit
7cf0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75  e3_realloc(pStru
7d00: 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ct, nByte);.    
7d10: 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
7d20: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74       memset(&pSt
7d30: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65  ruct->aLevel[nLe
7d40: 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  vel], 0, sizeof(
7d50: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7d60: 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72  el));.      pStr
7d70: 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20  uct->nLevel++;. 
7d80: 20 20 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d       *ppStruct =
7d90: 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65   pStruct;.    }e
7da0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
7db0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7dc0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7dd0: 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20  ** Extend level 
7de0: 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65  iLvl so that the
7df0: 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61  re is room for a
7e00: 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d  t least nExtra m
7e10: 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e  ore.** segments.
7e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e30: 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
7e40: 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20  endLevel(.  int 
7e50: 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72  *pRc, .  Fts5Str
7e60: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c  ucture *pStruct,
7e70: 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20   .  int iLvl, . 
7e80: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20   int nExtra, .  
7e90: 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20  int bInsert.){. 
7ea0: 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
7eb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
7ec0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
7ed0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
7ee0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
7ef0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
7f00: 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20  Segment *aNew;. 
7f10: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20     int nByte;.. 
7f20: 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c     nByte = (pLvl
7f30: 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29  ->nSeg + nExtra)
7f40: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
7f50: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
7f60: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
7f70: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c  te3_realloc(pLvl
7f80: 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a  ->aSeg, nByte);.
7f90: 20 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a      if( aNew ){.
7fa0: 20 20 20 20 20 20 69 66 28 20 62 49 6e 73 65 72        if( bInser
7fb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
7fc0: 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76  memset(&aNew[pLv
7fd0: 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a  l->nSeg], 0, siz
7fe0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7ff0: 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74  eSegment) * nExt
8000: 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ra);.      }else
8010: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d  {.        int nM
8020: 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  ove = pLvl->nSeg
8030: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
8040: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
8050: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
8060: 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20  (&aNew[nExtra], 
8070: 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20  aNew, nMove);.  
8080: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65        memset(aNe
8090: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  w, 0, sizeof(Fts
80a0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
80b0: 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20  t) * nExtra);.  
80c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c      }.      pLvl
80d0: 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20  ->aSeg = aNew;. 
80e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
80f0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
8100: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
8110: 0a 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72  ..static Fts5Str
8120: 75 63 74 75 72 65 20 2a 66 74 73 35 53 74 72 75  ucture *fts5Stru
8130: 63 74 75 72 65 52 65 61 64 55 6e 63 61 63 68 65  ctureReadUncache
8140: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
8150: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
8160: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74   *pRet = 0;.  Ft
8170: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
8180: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
8190: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
81c0: 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46  on cookie */.  F
81d0: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
81e0: 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
81f0: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
8200: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29  STRUCTURE_ROWID)
8210: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
8220: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8230: 2f 2a 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e  /* TODO: Do we n
8240: 65 65 64 20 74 68 69 73 20 69 66 20 74 68 65 20  eed this if the 
8250: 6c 65 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70  leaf-index is ap
8260: 70 65 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79  pended? Probably
8270: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ... */.    memse
8280: 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74  t(&pData->p[pDat
8290: 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f  a->nn], 0, FTS5_
82a0: 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20  DATA_PADDING);. 
82b0: 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53     p->rc = fts5S
82c0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
82d0: 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
82e0: 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70  nn, &iCookie, &p
82f0: 52 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  Ret);.    if( p-
8300: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
8310: 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b  & pConfig->iCook
8320: 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20  ie!=iCookie ){. 
8330: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
8340: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f  ite3Fts5ConfigLo
8350: 61 64 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f  ad(pConfig, iCoo
8360: 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kie);.    }.    
8370: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
8380: 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  pData);.    if( 
8390: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
83a0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
83b0: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
83c0: 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74  Ret);.      pRet
83d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
83e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
83f0: 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  }..static i64 ft
8400: 73 35 49 6e 64 65 78 44 61 74 61 56 65 72 73 69  s5IndexDataVersi
8410: 6f 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  on(Fts5Index *p)
8420: 7b 0a 20 20 69 36 34 20 69 56 65 72 73 69 6f 6e  {.  i64 iVersion
8430: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
8440: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8450: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 44 61 74  .    if( p->pDat
8460: 61 56 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20  aVersion==0 ){. 
8470: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73       p->rc = fts
8480: 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
8490: 74 28 70 2c 20 26 70 2d 3e 70 44 61 74 61 56 65  t(p, &p->pDataVe
84a0: 72 73 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20  rsion, .        
84b0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
84c0: 66 28 22 50 52 41 47 4d 41 20 25 51 2e 64 61 74  f("PRAGMA %Q.dat
84d0: 61 5f 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70  a_version", p->p
84e0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20  Config->zDb).   
84f0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
8500: 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
8510: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
8520: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
8530: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d  =sqlite3_step(p-
8540: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 29 20 29  >pDataVersion) )
8550: 7b 0a 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e  {.      iVersion
8560: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
8570: 6e 5f 69 6e 74 36 34 28 70 2d 3e 70 44 61 74 61  n_int64(p->pData
8580: 56 65 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  Version, 0);.   
8590: 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73   }.    p->rc = s
85a0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
85b0: 70 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  pDataVersion);. 
85c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65   }..  return iVe
85d0: 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
85e0: 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a  Read, deserializ
85f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
8600: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8610: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  d..**.** The Fts
8620: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
8630: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
8640: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
8650: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
8660: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
8670: 65 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ed as described 
8680: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  for function fts
8690: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
86a0: 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a  () .** above..**
86b0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
86c0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
86d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
86e0: 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20  error code left 
86f0: 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e  in the.** Fts5In
8700: 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  dex handle. If a
8710: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
8720: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
8730: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
8740: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ** is called, it
8750: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8760: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
8770: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
8780: 75 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65  ureRead(Fts5Inde
8790: 78 20 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  x *p){..  if( p-
87a0: 3e 70 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20  >pStruct==0 ){. 
87b0: 20 20 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72     p->iStructVer
87c0: 73 69 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65 78  sion = fts5Index
87d0: 44 61 74 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a  DataVersion(p);.
87e0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
87f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8800: 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 66    p->pStruct = f
8810: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8820: 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20  Uncached(p);.   
8830: 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20   }.  }..#if 0.  
8840: 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 53 74  else{.    Fts5St
8850: 72 75 63 74 75 72 65 20 2a 70 54 65 73 74 20 3d  ructure *pTest =
8860: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8870: 61 64 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20  adUncached(p);. 
8880: 20 20 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a     if( pTest ){.
8890: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
88a0: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
88b0: 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65   p->pStruct->nSe
88c0: 67 6d 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53  gment==pTest->nS
88d0: 65 67 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20 20  egment );.      
88e0: 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53  assert_nc( p->pS
88f0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70  truct->nLevel==p
8900: 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a  Test->nLevel );.
8910: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8920: 3c 70 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20  <pTest->nLevel; 
8930: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i++){.        as
8940: 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72  sert_nc( p->pStr
8950: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  uct->aLevel[i].n
8960: 4d 65 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c  Merge==pTest->aL
8970: 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29  evel[i].nMerge )
8980: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8990: 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d  _nc( p->pStruct-
89a0: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d  >aLevel[i].nSeg=
89b0: 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69  =pTest->aLevel[i
89c0: 5d 2e 6e 53 65 67 20 29 3b 0a 20 20 20 20 20 20  ].nSeg );.      
89d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65    for(j=0; j<pTe
89e0: 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53  st->aLevel[i].nS
89f0: 65 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; j++){.      
8a00: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
8a10: 65 53 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26  eSegment *p1 = &
8a20: 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  pTest->aLevel[i]
8a30: 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  .aSeg[j];.      
8a40: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
8a50: 65 53 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26  eSegment *p2 = &
8a60: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  p->pStruct->aLev
8a70: 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20  el[i].aSeg[j];. 
8a80: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
8a90: 6e 63 28 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d  nc( p1->iSegid==
8aa0: 70 32 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20 20  p2->iSegid );.  
8ab0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8ac0: 63 28 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74  c( p1->pgnoFirst
8ad0: 3d 3d 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20  ==p2->pgnoFirst 
8ae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
8af0: 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f  ert_nc( p1->pgno
8b00: 4c 61 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61  Last==p2->pgnoLa
8b10: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  st );.        }.
8b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
8b30: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8b40: 73 65 28 70 54 65 73 74 29 3b 0a 20 20 20 20 7d  se(pTest);.    }
8b50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
8b60: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
8b70: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  _OK ) return 0;.
8b80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
8b90: 72 75 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29  ructVersion!=0 )
8ba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
8bb0: 53 74 72 75 63 74 21 3d 30 20 29 3b 0a 20 20 66  Struct!=0 );.  f
8bc0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
8bd0: 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 72  p->pStruct);.  r
8be0: 65 74 75 72 6e 20 70 2d 3e 70 53 74 72 75 63 74  eturn p->pStruct
8bf0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
8c00: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
8c10: 76 61 6c 69 64 61 74 65 28 46 74 73 35 49 6e 64  validate(Fts5Ind
8c20: 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ex *p){.  if( p-
8c30: 3e 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20  >pStruct ){.    
8c40: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
8c50: 65 61 73 65 28 70 2d 3e 70 53 74 72 75 63 74 29  ease(p->pStruct)
8c60: 3b 0a 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74  ;.    p->pStruct
8c70: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
8c80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
8c90: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
8ca0: 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20  gments in index 
8cb0: 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
8cc0: 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t. This.** funct
8cd0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ion is only ever
8ce0: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
8cf0: 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69 74   assert() condit
8d00: 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ions..*/.#ifdef 
8d10: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
8d20: 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 72 75  tic int fts5Stru
8d30: 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
8d40: 74 73 28 46 74 73 35 53 74 72 75 63 74 75 72 65  ts(Fts5Structure
8d50: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
8d60: 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20  t nSegment = 0; 
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d80: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
8d90: 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   segments */.  i
8da0: 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
8db0: 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
8de0: 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
8df0: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76  s */.    for(iLv
8e00: 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
8e10: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
8e20: 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d 65  +){.      nSegme
8e30: 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61  nt += pStruct->a
8e40: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
8e50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
8e60: 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a  eturn nSegment;.
8e70: 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  }.#endif..#defin
8e80: 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65  e fts5BufferSafe
8e90: 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
8ea0: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b   pBlob, nBlob) {
8eb0: 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28       \.  assert(
8ec0: 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e   (pBuf)->nSpace>
8ed0: 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f  =((pBuf)->n+nBlo
8ee0: 62 29 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  b) );           
8ef0: 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70    \.  memcpy(&(p
8f00: 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e  Buf)->p[(pBuf)->
8f10: 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  n], pBlob, nBlob
8f20: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  );             \
8f30: 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20  .  (pBuf)->n += 
8f40: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
8f70: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66  .#define fts5Buf
8f80: 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
8f90: 69 6e 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20  int(pBuf, iVal) 
8fa0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
8fb0: 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b   \.  (pBuf)->n +
8fc0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
8fd0: 56 61 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e  Varint(&(pBuf)->
8fe0: 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69  p[(pBuf)->n], (i
8ff0: 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65  Val));  \.  asse
9000: 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61  rt( (pBuf)->nSpa
9010: 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b  ce>=(pBuf)->n );
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a            \.}...
9040: 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20  /*.** Serialize 
9050: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73  and store the "s
9060: 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64  tructure" record
9070: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
9080: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
9090: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
90a0: 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  in the Fts5Index
90b0: 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a   object. If an.*
90c0: 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  * error has alre
90d0: 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
90e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
90f0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
9100: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
9110: 74 75 72 65 57 72 69 74 65 28 46 74 73 35 49 6e  tureWrite(Fts5In
9120: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75  dex *p, Fts5Stru
9130: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
9140: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9150: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
9160: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 42 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c  Buffer to serial
9190: 69 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  ize record into 
91a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  */.    int iLvl;
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
91d0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
91e0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e  levels */.    in
91f0: 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20  t iCookie;      
9200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9210: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73  ookie value to s
9220: 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  tore */..    ass
9230: 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
9240: 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
9250: 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
9260: 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
9270: 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20     memset(&buf, 
9280: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
9290: 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ffer));..    /* 
92a0: 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72 65  Append the curre
92b0: 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  nt configuration
92c0: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69   cookie */.    i
92d0: 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e  Cookie = p->pCon
92e0: 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20  fig->iCookie;.  
92f0: 20 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20    if( iCookie<0 
9300: 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a  ) iCookie = 0;..
9310: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
9320: 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
9330: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34  (&p->rc, &buf, 4
9340: 2b 39 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20  +9+9+9) ){.     
9350: 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33   sqlite3Fts5Put3
9360: 32 28 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65  2(buf.p, iCookie
9370: 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 6e 20 3d  );.      buf.n =
9380: 20 34 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   4;.      fts5Bu
9390: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
93a0: 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75  rint(&buf, pStru
93b0: 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20  ct->nLevel);.   
93c0: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
93d0: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
93e0: 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  uf, pStruct->nSe
93f0: 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 66 74  gment);.      ft
9400: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
9410: 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 28  ndVarint(&buf, (
9420: 69 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72  i64)pStruct->nWr
9430: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20  iteCounter);.   
9440: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c   }..    for(iLvl
9450: 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
9460: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
9470: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  ){.      int iSe
9480: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
9490: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
94a0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
94b0: 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  h segments */.  
94c0: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
94d0: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
94e0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
94f0: 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73  iLvl];.      fts
9500: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
9510: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
9520: 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b  , pLvl->nMerge);
9530: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
9540: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9550: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9560: 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61  ->nSeg);.      a
9570: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65  ssert( pLvl->nMe
9580: 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20  rge<=pLvl->nSeg 
9590: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53  );..      for(iS
95a0: 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d  eg=0; iSeg<pLvl-
95b0: 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  >nSeg; iSeg++){.
95c0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
95d0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
95e0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
95f0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l->aSeg[iSeg].iS
9600: 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  egid);.        f
9610: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
9620: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
9630: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
9640: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
9650: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
9660: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9670: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
9680: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
9690: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
96a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
96b0: 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
96c0: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
96d0: 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  ID, buf.p, buf.n
96e0: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
96f0: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d  rFree(&buf);.  }
9700: 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .}..#if 0.static
9710: 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53   void fts5DebugS
9720: 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74  tructure(int*,Ft
9730: 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74  s5Buffer*,Fts5St
9740: 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69  ructure*);.stati
9750: 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74  c void fts5Print
9760: 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20  Structure(const 
9770: 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20  char *zCaption, 
9780: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
9790: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72  Struct){.  int r
97a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
97b0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
97c0: 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20  .  memset(&buf, 
97d0: 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b  0, sizeof(buf));
97e0: 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75  .  fts5DebugStru
97f0: 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c  cture(&rc, &buf,
9800: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72   pStruct);.  fpr
9810: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
9820: 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f  : %s\n", zCaptio
9830: 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c  n, buf.p);.  ffl
9840: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66  ush(stdout);.  f
9850: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
9860: 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  uf);.}.#else.# d
9870: 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53  efine fts5PrintS
9880: 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65  tructure(x,y).#e
9890: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74  ndif..static int
98a0: 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65   fts5SegmentSize
98b0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
98c0: 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20  gment *pSeg){.  
98d0: 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d  return 1 + pSeg-
98e0: 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67  >pgnoLast - pSeg
98f0: 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a  ->pgnoFirst;.}..
9900: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63  /*.** Return a c
9910: 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72  opy of index str
9920: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
9930: 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20  Except, promote 
9940: 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d  as many .** segm
9950: 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ents as possible
9960: 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f   to level iPromo
9970: 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63  te. If an OOM oc
9980: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a  curs, NULL is .*
9990: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
99a0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
99b0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
99c0: 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  o(.  Fts5Index *
99d0: 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  p,.  int iPromot
99e0: 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f  e,.  int szPromo
99f0: 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  te,.  Fts5Struct
9a00: 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a  ure *pStruct.){.
9a10: 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20    int il, is;.  
9a20: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
9a30: 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72  el *pOut = &pStr
9a40: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f  uct->aLevel[iPro
9a50: 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f  mote];..  if( pO
9a60: 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  ut->nMerge==0 ){
9a70: 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f  .    for(il=iPro
9a80: 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75  mote+1; il<pStru
9a90: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b  ct->nLevel; il++
9aa0: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
9ab0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
9ac0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
9ad0: 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20  evel[il];.      
9ae0: 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
9af0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9b00: 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53   for(is=pLvl->nS
9b10: 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d  eg-1; is>=0; is-
9b20: 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  -){.        int 
9b30: 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74  sz = fts5Segment
9b40: 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67  Size(&pLvl->aSeg
9b50: 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [is]);.        i
9b60: 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20  f( sz>szPromote 
9b70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
9b80: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
9b90: 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
9ba0: 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f  c, pStruct, iPro
9bb0: 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  mote, 1, 1);.   
9bc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
9bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
9be0: 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53   memcpy(pOut->aS
9bf0: 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
9c00: 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  is], sizeof(Fts5
9c10: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
9c20: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  ));.        pOut
9c30: 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20  ->nSeg++;.      
9c40: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a    pLvl->nSeg--;.
9c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9c60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77  }.}../*.** A new
9c70: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73   segment has jus
9c80: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
9c90: 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20  o level iLvl of 
9ca0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a  index structure.
9cb0: 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  ** pStruct. This
9cc0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
9cd0: 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d  ines if any segm
9ce0: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ents should be p
9cf0: 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20  romoted.** as a 
9d00: 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73  result. Segments
9d10: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e   are promoted in
9d20: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
9d30: 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68  **.**   a) If th
9d40: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
9d50: 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65  ritten is smalle
9d60: 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f  r than one or mo
9d70: 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20  re segments.**  
9d80: 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70      within the p
9d90: 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65  revious populate
9da0: 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70  d level, it is p
9db0: 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70  romoted to the p
9dc0: 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  revious.**      
9dd0: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e  populated level.
9de0: 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74  .**.**   b) If t
9df0: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9e00: 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65  written is large
9e10: 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73  r than the newes
9e20: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20  t segment on.** 
9e30: 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f       the next po
9e40: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74  pulated level, t
9e50: 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74  hen that segment
9e60: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
9e70: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20  adjacent.**     
9e80: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61   segments that a
9e90: 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20  re also smaller 
9ea0: 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73  than the one jus
9eb0: 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a  t written, are .
9ec0: 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64  **      promoted
9ed0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  . .**.** If one 
9ee0: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9ef0: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74   are promoted, t
9f00: 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  he structure obj
9f10: 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a  ect is updated.*
9f20: 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69  * to reflect thi
9f30: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
9f40: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
9f50: 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e  romote(.  Fts5In
9f60: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
9f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
9f80: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
9f90: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c        /* Index l
9fc0: 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65  evel just update
9fd0: 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  d */.  Fts5Struc
9fe0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20  ture *pStruct   
9ff0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a000: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a010: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
a030: 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20  t iTst;.    int 
a040: 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20  iPromote = -1;. 
a050: 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65     int szPromote
a060: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a070: 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74   /* Promote anyt
a080: 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f  hing this size o
a090: 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  r smaller */.   
a0a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
a0b0: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f  gment *pSeg;   /
a0c0: 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  * Segment just w
a0d0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
a0e0: 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20  t szSeg;        
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a100: 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a  ize of segment j
a110: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
a120: 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53     int nSeg = pS
a130: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
a140: 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69  vl].nSeg;..    i
a150: 66 28 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74  f( nSeg==0 ) ret
a160: 75 72 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  urn;.    pSeg = 
a170: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
a180: 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72  [iLvl].aSeg[pStr
a190: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
a1a0: 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73  ].nSeg-1];.    s
a1b0: 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67  zSeg = (1 + pSeg
a1c0: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
a1d0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a  g->pgnoFirst);..
a1e0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
a1f0: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a   condition (a) *
a200: 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69  /.    for(iTst=i
a210: 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26  Lvl-1; iTst>=0 &
a220: 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
a230: 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b  l[iTst].nSeg==0;
a240: 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66   iTst--);.    if
a250: 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iTst>=0 ){.   
a260: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
a270: 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20  int szMax = 0;. 
a280: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
a290: 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20  reLevel *pTst = 
a2a0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
a2b0: 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73  [iTst];.      as
a2c0: 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72  sert( pTst->nMer
a2d0: 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  ge==0 );.      f
a2e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e  or(i=0; i<pTst->
a2f0: 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
a300: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73      int sz = pTs
a310: 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c  t->aSeg[i].pgnoL
a320: 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67  ast - pTst->aSeg
a330: 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20  [i].pgnoFirst + 
a340: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  1;.        if( s
a350: 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20  z>szMax ) szMax 
a360: 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = sz;.      }.  
a370: 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73      if( szMax>=s
a380: 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  zSeg ){.        
a390: 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29  /* Condition (a)
a3a0: 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74   is true. Promot
a3b0: 65 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67  e the newest seg
a3c0: 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20  ment on level . 
a3d0: 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74         ** iLvl t
a3e0: 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a  o level iTst.  *
a3f0: 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f  /.        iPromo
a400: 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20  te = iTst;.     
a410: 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73     szPromote = s
a420: 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zMax;.      }.  
a430: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63    }..    /* If c
a440: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20  ondition (a) is 
a450: 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20  not met, assume 
a460: 28 62 29 20 69 73 20 74 72 75 65 2e 20 53 74 72  (b) is true. Str
a470: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
a480: 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ).    ** is a no
a490: 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74  -op if it is not
a4a0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  .  */.    if( iP
a4b0: 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20  romote<0 ){.    
a4c0: 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76    iPromote = iLv
a4d0: 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f  l;.      szPromo
a4e0: 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20  te = szSeg;.    
a4f0: 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
a500: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20  urePromoteTo(p, 
a510: 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d  iPromote, szProm
a520: 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  ote, pStruct);. 
a530: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   }.}.../*.** Adv
a540: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
a550: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
a560: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49  only argument. I
a570: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
a580: 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64   .** doclist-ind
a590: 65 78 20 70 61 67 65 20 69 73 20 72 65 61 63 68  ex page is reach
a5a0: 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ed, return non-z
a5b0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
a5c0: 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  nt fts5DlidxLvlN
a5d0: 65 78 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  ext(Fts5DlidxLvl
a5e0: 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44   *pLvl){.  Fts5D
a5f0: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76  ata *pData = pLv
a600: 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  l->pData;..  if(
a610: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29   pLvl->iOff==0 )
a620: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
a630: 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  vl->bEof==0 );. 
a640: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
a650: 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  1;.    pLvl->iOf
a660: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a670: 6e 74 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31  nt32(&pData->p[1
a680: 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67  ], pLvl->iLeafPg
a690: 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  no);.    pLvl->i
a6a0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
a6b0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70  rint(&pData->p[p
a6c0: 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34  Lvl->iOff], (u64
a6d0: 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29  *)&pLvl->iRowid)
a6e0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72  ;.    pLvl->iFir
a6f0: 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f  stOff = pLvl->iO
a700: 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
a710: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66   int iOff;.    f
a720: 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f  or(iOff=pLvl->iO
a730: 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  ff; iOff<pData->
a740: 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20  nn; iOff++){.   
a750: 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b     if( pData->p[
a760: 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a  iOff] ) break; .
a770: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
a780: 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b  Off<pData->nn ){
a790: 0a 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b  .      i64 iVal;
a7a0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65  .      pLvl->iLe
a7b0: 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20  afPgno += (iOff 
a7c0: 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20  - pLvl->iOff) + 
a7d0: 31 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  1;.      iOff +=
a7e0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
a7f0: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pData->p[iOff], 
a800: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
a810: 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64      pLvl->iRowid
a820: 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20   += iVal;.      
a830: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
a840: 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
a850: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
a860: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
a870: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
a880: 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  of;.}../*.** Adv
a890: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
a8a0: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
a8b0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
a8c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a8d0: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
a8e0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
a8f0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
a900: 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20  er, int iLvl){. 
a910: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
a920: 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
a930: 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73  vl[iLvl];..  ass
a940: 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d  ert( iLvl<pIter-
a950: 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66  >nLvl );.  if( f
a960: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a970: 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pLvl) ){.    if(
a980: 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65   (iLvl+1) < pIte
a990: 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20  r->nLvl ){.     
a9a0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
a9b0: 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  xtR(p, pIter, iL
a9c0: 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  vl+1);.      if(
a9d0: 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30   pLvl[1].bEof==0
a9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
a9f0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
aa00: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
aa10: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
aa20: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
aa30: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20  dxLvl));.       
aa40: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
aa50: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
aa70: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
aa80: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c  er->iSegid, iLvl
aa90: 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50  , pLvl[1].iLeafP
aaa0: 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
aab0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
aac0: 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c  ->pData ) fts5Dl
aad0: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
aae0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aaf0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
ab00: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
ab10: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
ab20: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
ab30: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
ab40: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
ab50: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
ab60: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
ab70: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  tR(p, pIter, 0);
ab80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
ab90: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
aba0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
abb0: 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c  ent has the foll
abc0: 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74  owing fields set
abd0: 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20  .** as follows. 
abe0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
abf0: 74 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f  ts up the rest o
ac00: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  f the iterator s
ac10: 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69  o that it.** poi
ac20: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
ac30: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f   rowid in the do
ac40: 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a  clist-index..**.
ac50: 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20  **   pData:.**  
ac60: 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f     pointer to do
ac70: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
ac80: 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  rd, .**.** When 
ac90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
aca0: 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69   called pIter->i
acb0: 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20  LeafPgno is the 
acc0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a  page number the.
acd0: 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73  ** doclist is as
ace0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74  sociated with (t
acf0: 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67  he one featuring
ad00: 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73   the term)..*/.s
ad10: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
ad20: 69 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73  idxIterFirst(Fts
ad30: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
ad40: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
ad50: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
ad60: 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
ad70: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
ad80: 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  t(&pIter->aLvl[i
ad90: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
ada0: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
adb0: 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  bEof;.}...static
adc0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
add0: 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
ade0: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
adf0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
ae00: 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  urn p->rc!=SQLIT
ae10: 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61  E_OK || pIter->a
ae20: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a  Lvl[0].bEof;.}..
ae30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ae40: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74  DlidxIterLast(Ft
ae50: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ae60: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
ae70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
ae80: 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c  * Advance each l
ae90: 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74  evel to the last
aea0: 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61   entry on the la
aeb0: 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72  st page */.  for
aec0: 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31  (i=pIter->nLvl-1
aed0: 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
aee0: 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29  OK && i>=0; i--)
aef0: 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c  {.    Fts5DlidxL
af00: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
af10: 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
af20: 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
af30: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30  LvlNext(pLvl)==0
af40: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   );.    pLvl->bE
af50: 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  of = 0;..    if(
af60: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74   i>0 ){.      Ft
af70: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69  s5DlidxLvl *pChi
af80: 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a  ld = &pLvl[-1];.
af90: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
afa0: 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44  lease(pChild->pD
afb0: 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ata);.      mems
afc0: 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69  et(pChild, 0, si
afd0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
afe0: 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c  l));.      pChil
aff0: 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  d->pData = fts5D
b000: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
b010: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
b020: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
b030: 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d  egid, i-1, pLvl-
b040: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
b050: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
b060: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
b070: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
b080: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
b090: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65  ument to the pre
b0a0: 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a  vious entry..*/.
b0b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
b0c0: 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35  lidxLvlPrev(Fts5
b0d0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b  DlidxLvl *pLvl){
b0e0: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c  .  int iOff = pL
b0f0: 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73  vl->iOff;..  ass
b100: 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d  ert( pLvl->bEof=
b110: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  =0 );.  if( iOff
b120: 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  <=pLvl->iFirstOf
b130: 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62  f ){.    pLvl->b
b140: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
b150: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c  {.    u8 *a = pL
b160: 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20  vl->pData->p;.  
b170: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b180: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
b190: 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20  int ii;.    int 
b1a0: 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20  nZero = 0;..    
b1b0: 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66  /* Currently iOf
b1c0: 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  f points to the 
b1d0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20  first byte of a 
b1e0: 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f  varint. This blo
b1f0: 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65  ck .    ** decre
b200: 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c  ments iOff until
b210: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
b220: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b230: 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20  the previous .  
b240: 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b    ** varint. Tak
b250: 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20  ing care not to 
b260: 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20  read any memory 
b270: 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f  locations that o
b280: 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f  ccur.    ** befo
b290: 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  re the buffer in
b2a0: 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20   memory.  */.   
b2b0: 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e   iLimit = (iOff>
b2c0: 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b  9 ? iOff-9 : 0);
b2d0: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b  .    for(iOff--;
b2e0: 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f   iOff>iLimit; iO
b2f0: 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  ff--){.      if(
b300: 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78   (a[iOff-1] & 0x
b310: 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  80)==0 ) break;.
b320: 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47      }..    fts5G
b330: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
b340: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
b350: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69  .    pLvl->iRowi
b360: 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70  d -= iVal;.    p
b370: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  Lvl->iLeafPgno--
b380: 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62  ;..    /* Skip b
b390: 61 63 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e  ackwards past an
b3a0: 79 20 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20  y 0x00 varints. 
b3b0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f  */.    for(ii=iO
b3c0: 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e  ff-1; ii>=pLvl->
b3d0: 69 46 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69  iFirstOff && a[i
b3e0: 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b  i]==0x00; ii--){
b3f0: 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a  .      nZero++;.
b400: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69      }.    if( ii
b410: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
b420: 66 20 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78  f && (a[ii] & 0x
b430: 38 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  80) ){.      /* 
b440: 54 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  The byte immedia
b450: 74 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20  tely before the 
b460: 6c 61 73 74 20 30 78 30 30 20 62 79 74 65 20 68  last 0x00 byte h
b470: 61 73 20 74 68 65 20 30 78 38 30 20 62 69 74 0a  as the 0x80 bit.
b480: 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f        ** set. So
b490: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 69   the last 0x00 i
b4a0: 73 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20  s only a varint 
b4b0: 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 38  0 if there are 8
b4c0: 20 6d 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20   more 0x80.     
b4d0: 20 2a 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65   ** bytes before
b4e0: 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20   a[ii]. */.     
b4f0: 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20   int bZero = 0; 
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b510: 54 72 75 65 20 69 66 20 6c 61 73 74 20 30 78 30  True if last 0x0
b520: 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20  0 counts */.    
b530: 20 20 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c    if( (ii-8)>=pL
b540: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b  vl->iFirstOff ){
b550: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
b560: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b          for(j=1;
b570: 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a   j<=8 && (a[ii-j
b580: 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b  ] & 0x80); j++);
b590: 0a 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d  .        bZero =
b5a0: 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a   (j>8);.      }.
b5b0: 20 20 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d        if( bZero=
b5c0: 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20  =0 ) nZero--;.  
b5d0: 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c    }.    pLvl->iL
b5e0: 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f  eafPgno -= nZero
b5f0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
b600: 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b   = iOff - nZero;
b610: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b620: 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  Lvl->bEof;.}..st
b630: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b640: 64 78 49 74 65 72 50 72 65 76 52 28 46 74 73 35  dxIterPrevR(Fts5
b650: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
b660: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  idxIter *pIter, 
b670: 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73  int iLvl){.  Fts
b680: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
b690: 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  = &pIter->aLvl[i
b6a0: 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lvl];..  assert(
b6b0: 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76   iLvl<pIter->nLv
b6c0: 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44  l );.  if( fts5D
b6d0: 6c 69 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c  lidxLvlPrev(pLvl
b6e0: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c  ) ){.    if( (iL
b6f0: 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e  vl+1) < pIter->n
b700: 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73  Lvl ){.      fts
b710: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28  5DlidxIterPrevR(
b720: 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31  p, pIter, iLvl+1
b730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  );.      if( pLv
b740: 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a  l[1].bEof==0 ){.
b750: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
b760: 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
b770: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ata);.        me
b780: 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69  mset(pLvl, 0, si
b790: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
b7a0: 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76  l));.        pLv
b7b0: 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  l->pData = fts5D
b7c0: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
b7d0: 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
b7e0: 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e  DX_ROWID(pIter->
b7f0: 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c  iSegid, iLvl, pL
b800: 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29  vl[1].iLeafPgno)
b810: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
b820: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44      if( pLvl->pD
b830: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
b840: 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
b850: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d  xLvlNext(pLvl)==
b860: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
b870: 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20  Lvl->bEof = 0;. 
b880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
b8a0: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
b8b0: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74  [0].bEof;.}.stat
b8c0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b8d0: 49 74 65 72 50 72 65 76 28 46 74 73 35 49 6e 64  IterPrev(Fts5Ind
b8e0: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
b8f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b900: 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78  return fts5Dlidx
b910: 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74  IterPrevR(p, pIt
b920: 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er, 0);.}../*.**
b930: 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d   Free a doclist-
b940: 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f  index iterator o
b950: 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20  bject allocated 
b960: 62 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  by fts5DlidxIter
b970: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
b980: 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78  c void fts5Dlidx
b990: 49 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69  IterFree(Fts5Dli
b9a0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
b9b0: 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
b9c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
b9d0: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
b9e0: 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
b9f0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ba00: 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d  e(pIter->aLvl[i]
ba10: 2e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  .pData);.    }. 
ba20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ba30: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pIter);.  }.}..s
ba40: 74 61 74 69 63 20 46 74 73 35 44 6c 69 64 78 49  tatic Fts5DlidxI
ba50: 74 65 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74  ter *fts5DlidxIt
ba60: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
ba70: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
ba80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
ba90: 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 Backend to ite
baa0: 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
bab0: 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44   /* True for ORD
bae0: 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69  ER BY ASC */.  i
baf0: 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb10: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
bb20: 20 20 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20    int iLeafPg   
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e    /* Leaf page n
bb50: 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c  umber to load dl
bb60: 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20  idx for */.){.  
bb70: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
bb80: 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Iter = 0;.  int 
bb90: 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d  i;.  int bDone =
bba0: 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
bbb0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
bbc0: 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b   && bDone==0; i+
bbd0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  +){.    int nByt
bbe0: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44  e = sizeof(Fts5D
bbf0: 6c 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20  lidxIter) + i * 
bc00: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
bc10: 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c  Lvl);.    Fts5Dl
bc20: 69 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  idxIter *pNew;..
bc30: 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35      pNew = (Fts5
bc40: 44 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74  DlidxIter*)sqlit
bc50: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
bc60: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
bc70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
bc80: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
bc90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
bca0: 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52  se{.      i64 iR
bcb0: 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49 44  owid = FTS5_DLID
bcc0: 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  X_ROWID(iSegid, 
bcd0: 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20 20  i, iLeafPg);.   
bce0: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
bcf0: 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61  *pLvl = &pNew->a
bd00: 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49  Lvl[i];.      pI
bd10: 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ter = pNew;.    
bd20: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
bd30: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
bd40: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70  dxLvl));.      p
bd50: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
bd60: 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
bd70: 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
bd80: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20 28  pLvl->pData && (
bd90: 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30  pLvl->pData->p[0
bda0: 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20 29  ] & 0x0001)==0 )
bdb0: 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20  {.        bDone 
bdc0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
bdd0: 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d     pIter->nLvl =
bde0: 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i+1;.    }.  }.
bdf0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
be00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
be10: 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69  Iter->iSegid = i
be20: 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20 62  Segid;.    if( b
be30: 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rev==0 ){.      
be40: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
be50: 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  st(pIter);.    }
be60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
be70: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 2c  DlidxIterLast(p,
be80: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
be90: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21   }..  if( p->rc!
bea0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
beb0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
bec0: 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ree(pIter);.    
bed0: 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pIter = 0;.  }..
bee0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a    return pIter;.
bef0: 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  }..static i64 ft
bf00: 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
bf10: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
bf20: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
bf30: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
bf40: 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63  iRowid;.}.static
bf50: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
bf60: 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64 78  erPgno(Fts5Dlidx
bf70: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
bf80: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
bf90: 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b  vl[0].iLeafPgno;
bfa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
bfb0: 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67  he next leaf pag
bfc0: 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65  e into the segme
bfd0: 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a  nt iterator..*/.
bfe0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
bff0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c000: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
c030: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
c040: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c050: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
c060: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
c070: 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61  vance to next pa
c080: 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  ge */.){.  Fts5D
c090: 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74  ata *pLeaf;.  Ft
c0a0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
c0b0: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
c0c0: 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61  ->pSeg;.  fts5Da
c0d0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
c0e0: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
c0f0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20  ->iLeafPgno++;. 
c100: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65 78   if( pIter->pNex
c110: 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74  tLeaf ){.    pIt
c120: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74 65  er->pLeaf = pIte
c130: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20  r->pNextLeaf;.  
c140: 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65    pIter->pNextLe
c150: 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  af = 0;.  }else 
c160: 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  if( pIter->iLeaf
c170: 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f  Pgno<=pSeg->pgno
c180: 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65  Last ){.    pIte
c190: 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 4c  r->pLeaf = fts5L
c1a0: 65 61 66 52 65 61 64 28 70 2c 20 0a 20 20 20 20  eafRead(p, .    
c1b0: 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54      FTS5_SEGMENT
c1c0: 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
c1d0: 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  gid, pIter->iLea
c1e0: 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20  fPgno).    );.  
c1f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
c200: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  ->pLeaf = 0;.  }
c210: 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72  .  pLeaf = pIter
c220: 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20  ->pLeaf;..  if( 
c230: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74  pLeaf ){.    pIt
c240: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
c250: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
c260: 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
c270: 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29  sTermless(pLeaf)
c280: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
c290: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
c2a0: 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20   pLeaf->nn+1;.  
c2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
c2c0: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
c2d0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
c2e0: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74  32(&pLeaf->p[pIt
c2f0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a  er->iPgidxOff],.
c300: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
c310: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20  >iEndofDoclist. 
c320: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
c330: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  }.}../*.** Argum
c340: 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
c350: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
c360: 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20  ing a varint to 
c370: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
c380: 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  s a.** position 
c390: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
c3a0: 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e 74   Read the varint
c3b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
c3c0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
c3d0: 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20  ** read. Before 
c3e0: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
c3f0: 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62  pnSz to the numb
c400: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
c410: 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c  he position.** l
c420: 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20  ist, and *pbDel 
c430: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 64  to true if the d
c440: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
c450: 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  t, or false othe
c460: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
c470: 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c   int fts5GetPosl
c480: 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38  istSize(const u8
c490: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20   *p, int *pnSz, 
c4a0: 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69  int *pbDel){.  i
c4b0: 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20  nt nSz;.  int n 
c4c0: 3d 20 30 3b 0a 20 20 66 74 73 35 46 61 73 74 47  = 0;.  fts5FastG
c4d0: 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 2c  etVarint32(p, n,
c4e0: 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f   nSz);.  assert_
c4f0: 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20  nc( nSz>=0 );.  
c500: 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20  *pnSz = nSz/2;. 
c510: 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20   *pbDel = nSz & 
c520: 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72 6e  0x0001;.  return
c530: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73   n;.}../*.** Fts
c540: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
c550: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
c560: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
c570: 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20  st byte of a.** 
c580: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
c590: 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74  ze field. Read t
c5a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c5b0: 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65 20  field and store 
c5c0: 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  it.** in the fol
c5d0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
c5e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65  :.**.**   Fts5Se
c5f0: 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20  gIter.nPos.**   
c600: 46 74 73 35 53 65 67 49 74 65 72 2e 62 44 65 6c  Fts5SegIter.bDel
c610: 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73  .**.** Leave Fts
c620: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
c630: 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  fset pointing to
c640: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c650: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74  of the .** posit
c660: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
c670: 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74   (if any)..*/.st
c680: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
c690: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74  gIterLoadNPos(Ft
c6a0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
c6b0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
c6c0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
c6d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
c6e0: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
c6f0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
c700: 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64  * Offset to read
c710: 20 61 74 20 2a 2f 0a 20 20 20 20 41 53 53 45 52   at */.    ASSER
c720: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
c730: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 69  r->pLeaf);.    i
c740: 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  f( p->pConfig->e
c750: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
c760: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
c770: 20 20 69 6e 74 20 69 45 6f 64 20 3d 20 4d 49 4e    int iEod = MIN
c780: 28 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  (pIter->iEndofDo
c790: 63 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 70 4c  clist, pIter->pL
c7a0: 65 61 66 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20 20  eaf->szLeaf);.  
c7b0: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
c7c0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72  = 0;.      pIter
c7d0: 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20  ->nPos = 1;.    
c7e0: 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20    if( iOff<iEod 
c7f0: 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  && pIter->pLeaf-
c800: 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  >p[iOff]==0 ){. 
c810: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44         pIter->bD
c820: 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  el = 1;.        
c830: 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
c840: 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26  if( iOff<iEod &&
c850: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
c860: 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOff]==0 ){.   
c870: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50         pIter->nP
c880: 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  os = 1;.        
c890: 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
c8a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c8b0: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
c8c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
c8d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
c8e0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a  .      int nSz;.
c8f0: 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
c900: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d  tVarint32(pIter-
c910: 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c  >pLeaf->p, iOff,
c920: 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74   nSz);.      pIt
c930: 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20  er->bDel = (nSz 
c940: 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20  & 0x0001);.     
c950: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e   pIter->nPos = n
c960: 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73  Sz>>1;.      ass
c970: 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e  ert_nc( pIter->n
c980: 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Pos>=0 );.    }.
c990: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
c9a0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
c9b0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
c9c0: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
c9d0: 64 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  dRowid(Fts5Index
c9e0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
c9f0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a   *pIter){.  u8 *
ca00: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
ca10: 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ->p;        /* B
ca20: 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61  uffer to read da
ca30: 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ta from */.  int
ca40: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
ca50: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41  LeafOffset;..  A
ca60: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
ca70: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
ca80: 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72   if( iOff>=pIter
ca90: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
caa0: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
cab0: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
cac0: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ter);.    if( pI
cad0: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b  ter->pLeaf==0 ){
cae0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
caf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
cb00: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
cb10: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
cb20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66  ;.    }.    iOff
cb30: 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49   = 4;.    a = pI
cb40: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
cb50: 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c   }.  iOff += sql
cb60: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
cb70: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
cb80: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
cb90: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
cba0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cbb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67  }../*.** Fts5Seg
cbc0: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
cbd0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
cbe0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
cbf0: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22  yte of the .** "
cc00: 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f  nSuffix" field o
cc10: 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69  f a term. Functi
cc20: 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65  on parameter nKe
cc30: 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ep contains the 
cc40: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
cc50: 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64 20  "nPrefix" field 
cc60: 28 69 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e  (if there was on
cc70: 65 20 2d 20 69 74 20 69 73 20 70 61 73 73 65 64  e - it is passed
cc80: 20 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a   0 if this is.**
cc90: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
cca0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e  in the segment).
ccb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
ccc0: 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a  tion populates:.
ccd0: 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  **.**   Fts5SegI
cce0: 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74  ter.term.**   Ft
ccf0: 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a  s5SegIter.rowid.
cd00: 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  **.** accordingl
cd10: 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74  y and leaves (Ft
cd20: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
cd30: 66 66 73 65 74 29 20 73 65 74 20 74 6f 20 74 68  ffset) set to th
cd40: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
cd50: 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69  the first positi
cd60: 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73  on list. The pos
cd70: 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e  ition list belon
cd80: 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74  ging to document
cd90: 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65   .** (Fts5SegIte
cda0: 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74  r.iRowid)..*/.st
cdb0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
cdc0: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74  gIterLoadTerm(Ft
cdd0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
cde0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
cdf0: 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38  int nKeep){.  u8
ce00: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
ce10: 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a  af->p;        /*
ce20: 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20   Buffer to read 
ce30: 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  data from */.  i
ce40: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
ce50: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
ce60: 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64  * Offset to read
ce70: 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65   at */.  int nNe
ce80: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
ce90: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
cea0: 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f  s of new data */
ceb0: 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35  ..  iOff += fts5
cec0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
ced0: 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 69  Off], nNew);.  i
cee0: 66 28 20 69 4f 66 66 2b 6e 4e 65 77 3e 70 49 74  f( iOff+nNew>pIt
cef0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 7c 7c  er->pLeaf->nn ||
cf00: 20 6e 4b 65 65 70 3e 70 49 74 65 72 2d 3e 74 65   nKeep>pIter->te
cf10: 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72  rm.n ){.    p->r
cf20: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
cf30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
cf40: 7d 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e  }.  pIter->term.
cf50: 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73  n = nKeep;.  fts
cf60: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
cf70: 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  b(&p->rc, &pIter
cf80: 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61  ->term, nNew, &a
cf90: 5b 69 4f 66 66 5d 29 3b 0a 20 20 61 73 73 65 72  [iOff]);.  asser
cfa0: 74 28 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e  t( pIter->term.n
cfb0: 3c 3d 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 53  <=pIter->term.nS
cfc0: 70 61 63 65 20 29 3b 0a 20 20 69 4f 66 66 20 2b  pace );.  iOff +
cfd0: 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  = nNew;.  pIter-
cfe0: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
cff0: 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72   = iOff;.  pIter
d000: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
d010: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
d020: 6e 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  no;.  pIter->iLe
d030: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
d040: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ..  if( pIter->i
d050: 50 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d  PgidxOff>=pIter-
d060: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20  >pLeaf->nn ){.  
d070: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
d080: 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e  oclist = pIter->
d090: 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d  pLeaf->nn+1;.  }
d0a0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
d0b0: 78 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d  xtra;.    pIter-
d0c0: 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74  >iPgidxOff += ft
d0d0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
d0e0: 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66  [pIter->iPgidxOf
d0f0: 66 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  f], nExtra);.   
d100: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
d110: 63 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b  clist += nExtra;
d120: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
d130: 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20  terLoadRowid(p, 
d140: 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  pIter);.}..stati
d150: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
d160: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
d170: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d180: 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76   int*);.static v
d190: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
d1a0: 65 78 74 5f 52 65 76 65 72 73 65 28 46 74 73 35  ext_Reverse(Fts5
d1b0: 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49  Index*, Fts5SegI
d1c0: 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61  ter*, int*);.sta
d1d0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
d1e0: 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74  IterNext_None(Ft
d1f0: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
d200: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a  gIter*, int*);..
d210: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d220: 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 46  SegIterSetNext(F
d230: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
d240: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
d250: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66  {.  if( pIter->f
d260: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
d270: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
d280: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d290: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d2a0: 74 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c  t_Reverse;.  }el
d2b0: 73 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69  se if( p->pConfi
d2c0: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
d2d0: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
d2e0: 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74      pIter->xNext
d2f0: 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65   = fts5SegIterNe
d300: 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65  xt_None;.  }else
d310: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65  {.    pIter->xNe
d320: 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72  xt = fts5SegIter
d330: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Next;.  }.}../*.
d340: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
d350: 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
d360: 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61  t pIter to itera
d370: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  te through the e
d380: 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67  ntries in.** seg
d390: 6d 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69  ment pSeg. The i
d3a0: 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
d3b0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
d3c0: 66 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e  first entry when
d3d0: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
d3e0: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  on returns..**.*
d3f0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
d400: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
d410: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
d420: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
d430: 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
d440: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
d450: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
d460: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d470: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
d480: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
d490: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
d4a0: 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
d4b0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d4d0: 54 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  TS index object 
d4e0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
d4f0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
d500: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
d510: 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
d520: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
d530: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
d540: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
d550: 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
d560: 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
d570: 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
d580: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
d590: 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  if the segment i
d5a0: 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20  s being used as 
d5b0: 61 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69  an input to an i
d5c0: 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a  ncremental.    *
d5d0: 2a 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20  * merge and all 
d5e0: 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79  data has already
d5f0: 20 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e   been "trimmed".
d600: 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   See function.  
d610: 20 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67    ** fts5TrimSeg
d620: 6d 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61  ments() for deta
d630: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
d640: 65 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72  e leave the iter
d650: 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20  ator empty..    
d660: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  ** The caller wi
d670: 6c 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65  ll see the (pIte
d680: 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64  r->pLeaf==0) and
d690: 20 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72   assume the iter
d6a0: 61 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61  ator is.    ** a
d6b0: 74 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a  t EOF already. *
d6c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
d6d0: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b  ter->pLeaf==0 );
d6e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d6f0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
d700: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d710: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
d720: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
d730: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d740: 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
d750: 72 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  r);.    pIter->p
d760: 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20  Seg = pSeg;.    
d770: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d780: 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
d790: 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  st-1;.    fts5Se
d7a0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
d7b0: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20   pIter);.  }..  
d7c0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
d7d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
d7e0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d7f0: 20 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e   4;.    assert_n
d800: 63 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  c( pIter->pLeaf-
d810: 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73  >nn>4 );.    ass
d820: 65 72 74 5f 6e 63 28 20 66 74 73 35 4c 65 61 66  ert_nc( fts5Leaf
d830: 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74  FirstTermOff(pIt
d840: 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29 3b  er->pLeaf)==4 );
d850: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
d860: 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 70  dxOff = pIter->p
d870: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a  Leaf->szLeaf+1;.
d880: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
d890: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
d8a0: 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65  , 0);.    fts5Se
d8b0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
d8c0: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
d8d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d8e0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ion is only ever
d8f0: 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61   called on itera
d900: 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79 20  tors created by 
d910: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35  calls to.** Fts5
d920: 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69 74  IndexQuery() wit
d930: 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  h the FTS5INDEX_
d940: 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67 20  QUERY_DESC flag 
d950: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  set..**.** The i
d960: 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61 6e  terator is in an
d970: 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20 77   unusual state w
d980: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d990: 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68 65  n is called: the
d9a0: 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e  .** Fts5SegIter.
d9b0: 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72 69  iLeafOffset vari
d9c0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
d9d0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
d9e0: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
d9f0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
da00: 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ize field for th
da10: 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74  e first relevant
da20: 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
da30: 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ge..** Fts5SegIt
da40: 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74 2c  er.rowid is set,
da50: 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62 44   but nPos and bD
da60: 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a  el are not..**.*
da70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
da80: 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74 65  advances the ite
da90: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74  rator so that it
daa0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
dab0: 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e 74  ast .** relevant
dac0: 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
dad0: 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ge and, if neces
dae0: 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65  sary, initialize
daf0: 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69 64  s the .** aRowid
db00: 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f  Offset[] and iRo
db10: 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61 62  widOffset variab
db20: 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f 69  les. At this poi
db30: 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  nt the iterator.
db40: 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65 67  ** is in its reg
db50: 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74 73  ular state - Fts
db60: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
db70: 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
db80: 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65  he first.** byte
db90: 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
dba0: 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61 73   list content as
dbb0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 61  sociated with sa
dbc0: 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  id rowid..*/.sta
dbd0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
dbe0: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
dbf0: 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  age(Fts5Index *p
dc00: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
dc10: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44 65  Iter){.  int eDe
dc20: 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
dc30: 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69 6e  g->eDetail;.  in
dc40: 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
dc50: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e  af->szLeaf;.  in
dc60: 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  t i = pIter->iLe
dc70: 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  afOffset;.  u8 *
dc80: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
dc90: 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69  ->p;.  int iRowi
dca0: 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  dOffset = 0;..  
dcb0: 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e  if( n>pIter->iEn
dcc0: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
dcd0: 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e    n = pIter->iEn
dce0: 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a  dofDoclist;.  }.
dcf0: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
dd00: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
dd10: 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
dd20: 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20  .    i64 iDelta 
dd30: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  = 0;..    if( eD
dd40: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
dd50: 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
dd60: 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20   /* todo */.    
dd70: 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69    if( i<n && a[i
dd80: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
dd90: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i++;.        if(
dda0: 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20   i<n && a[i]==0 
ddb0: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) i++;.      }. 
ddc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ddd0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
dde0: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
ddf0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f    i += fts5GetPo
de00: 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c  slistSize(&a[i],
de10: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
de20: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 6f  ;.      i += nPo
de30: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
de40: 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20   i>=n ) break;. 
de50: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
de60: 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36  arint(&a[i], (u6
de70: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
de80: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
de90: 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f  = iDelta;..    /
dea0: 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20  * If necessary, 
deb0: 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d 3e  grow the pIter->
dec0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
ded0: 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rray. */.    if(
dee0: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70   iRowidOffset>=p
def0: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
df00: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
df10: 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52  nNew = pIter->nR
df20: 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a  owidOffset + 8;.
df30: 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20        int *aNew 
df40: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
df50: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61  realloc(pIter->a
df60: 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65  RowidOffset, nNe
df70: 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  w*sizeof(int));.
df80: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
df90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
dfa0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
dfb0: 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  M;.        break
dfc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dfd0: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
dfe0: 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  set = aNew;.    
dff0: 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f    pIter->nRowidO
e000: 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20  ffset = nNew;.  
e010: 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
e020: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f  aRowidOffset[iRo
e030: 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70  widOffset++] = p
e040: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e050: 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
e060: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  eafOffset = i;. 
e070: 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77   }.  pIter->iRow
e080: 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69  idOffset = iRowi
e090: 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53  dOffset;.  fts5S
e0a0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
e0b0: 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
e0c0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
e0d0: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
e0e0: 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35  erseNewPage(Fts5
e0f0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
e100: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
e110: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
e120: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e130: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a  ITER_REVERSE );.
e140: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e150: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e160: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
e170: 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
e180: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
e190: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
e1a0: 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
e1b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
e1c0: 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   && pIter->iLeaf
e1d0: 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72  Pgno>pIter->iTer
e1e0: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
e1f0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b   Fts5Data *pNew;
e200: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
e210: 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65  fPgno--;.    pNe
e220: 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  w = fts5DataRead
e230: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
e240: 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20  _ROWID(.        
e250: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69    pIter->pSeg->i
e260: 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c  Segid, pIter->iL
e270: 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a  eafPgno.    ));.
e280: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
e290: 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65        /* iTermLe
e2a0: 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65 20  afOffset may be 
e2b0: 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20  equal to szLeaf 
e2c0: 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 74  if the term is t
e2d0: 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a  he last.      **
e2e0: 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70 61   thing on the pa
e2f0: 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66 69  ge - i.e. the fi
e300: 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e 20  rst rowid is on 
e310: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
e320: 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  ge..      ** In 
e330: 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20  this case leave 
e340: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c  pIter->pLeaf==0,
e350: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69   this iterator i
e360: 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20  s at EOF. */.   
e370: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c     if( pIter->iL
e380: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
e390: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
e3a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e3b0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
e3c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e3d0: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
e3e0: 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c  Offset<pNew->szL
e3f0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
e400: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
e410: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  pNew;.          
e420: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e430: 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72  et = pIter->iTer
e440: 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  mLeafOffset;.   
e450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e460: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
e470: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
e480: 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
e490: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
e4a0: 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  dOff(pNew);.    
e4b0: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
e4c0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
e4d0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
e4e0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
e4f0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e500: 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
e510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e520: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e530: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
e540: 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65     u8 *a = &pIte
e550: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  r->pLeaf->p[pIte
e560: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  r->iLeafOffset];
e570: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
e580: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66  iLeafOffset += f
e590: 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
e5a0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
e5b0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
e5c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
e5d0: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  e{.        fts5D
e5e0: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
e5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e600: 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
e610: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70  ->pLeaf ){.    p
e620: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
e630: 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  ist = pIter->pLe
e640: 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74  af->nn+1;.    ft
e650: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
e660: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
e670: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
e680: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
e690: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
e6a0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
e6b0: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
e6c0: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
e6d0: 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  o a delete marke
e6e0: 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b  r. A delete mark
e6f0: 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77  er is an entry w
e700: 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20  ith a 0 byte.** 
e710: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a  position-list..*
e720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
e730: 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
e740: 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
e750: 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
e760: 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
e770: 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
e780: 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
e790: 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
e7a0: 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
e7b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65  SQLITE_OK && pSe
e7c0: 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67  g->pLeaf && pSeg
e7d0: 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f  ->nPos==0);.}../
e7e0: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
e7f0: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
e800: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a  he next entry..*
e810: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
e820: 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65 72  n of fts5SegIter
e830: 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  Next() is only u
e840: 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20 69  sed by reverse i
e850: 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61  terators..*/.sta
e860: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
e870: 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65  IterNext_Reverse
e880: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
e890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e8a0: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
e8b0: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
e8c0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
e8d0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
e8e0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
e8f0: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
e900: 2a 70 62 55 6e 75 73 65 64 20 20 20 20 20 20 20  *pbUnused       
e910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
e920: 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  nused */.){.  as
e930: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
e940: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
e950: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
e960: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e  ssert( pIter->pN
e970: 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
e980: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 62 55  UNUSED_PARAM(pbU
e990: 6e 75 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 70  nused);..  if( p
e9a0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
e9b0: 65 74 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  et>0 ){.    u8 *
e9c0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
e9d0: 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ->p;.    int iOf
e9e0: 66 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  f;.    i64 iDelt
e9f0: 61 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a;..    pIter->i
ea00: 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20  RowidOffset--;. 
ea10: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
ea20: 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 61  ffset = pIter->a
ea30: 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65  RowidOffset[pIte
ea40: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d  r->iRowidOffset]
ea50: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
ea60: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
ea70: 65 72 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  er);.    iOff = 
ea80: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ea90: 65 74 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  et;.    if( p->p
eaa0: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
eab0: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
eac0: 45 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  E ){.      iOff 
ead0: 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a  += pIter->nPos;.
eae0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 47 65      }.    fts5Ge
eaf0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
eb00: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
eb10: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
eb20: 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20  wid -= iDelta;. 
eb30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
eb40: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
eb50: 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
eb60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
eb70: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
eb80: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
eb90: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
eba0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 74  is version of ft
ebb0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29 20  s5SegIterNext() 
ebc0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
ebd0: 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20  detail=none and 
ebe0: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
ebf0: 69 73 20 6e 6f 74 20 61 20 72 65 76 65 72 73 65  is not a reverse
ec00: 20 64 69 72 65 63 74 69 6f 6e 20 69 74 65 72 61   direction itera
ec10: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
ec20: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
ec30: 65 78 74 5f 4e 6f 6e 65 28 0a 20 20 46 74 73 35  ext_None(.  Fts5
ec40: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ec60: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
ec70: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
ec80: 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
ec90: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
eca0: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
ecb0: 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65  /.  int *pbNewTe
ecc0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
ecd0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
ece0: 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a  for new term */.
ecf0: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  ){.  int iOff;..
ed00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
ed10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
ed20: 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d 3e  assert( (pIter->
ed30: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
ed40: 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30  ITER_REVERSE)==0
ed50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ed60: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
ed70: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
ed80: 4f 4e 45 20 29 3b 0a 0a 20 20 41 53 53 45 52 54  ONE );..  ASSERT
ed90: 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72  _SZLEAF_OK(pIter
eda0: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66  ->pLeaf);.  iOff
edb0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
edc0: 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78  ffset;..  /* Nex
edd0: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
ede0: 65 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 20  e next page */. 
edf0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
ee00: 20 26 26 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d   && iOff>=pIter-
ee10: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
ee20: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
ee30: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
ee40: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  er);.    if( p->
ee50: 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65  rc || pIter->pLe
ee60: 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
ee70: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
ee80: 64 20 3d 20 30 3b 0a 20 20 20 20 69 4f 66 66 20  d = 0;.    iOff 
ee90: 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 4;.  }..  if( 
eea0: 69 4f 66 66 3c 70 49 74 65 72 2d 3e 69 45 6e 64  iOff<pIter->iEnd
eeb0: 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  ofDoclist ){.   
eec0: 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
eed0: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
eee0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 36 34   page */.    i64
eef0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 4f 66   iDelta;.    iOf
ef00: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
ef10: 47 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72  GetVarint(&pIter
ef20: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
ef30: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
ef40: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
ef50: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
ef60: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
ef70: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
ef80: 7d 65 6c 73 65 20 69 66 28 20 28 70 49 74 65 72  }else if( (pIter
ef90: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
efa0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 3d  EGITER_ONETERM)=
efb0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  =0 ){.    if( pI
efc0: 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20 20 20  ter->pSeg ){.   
efd0: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
efe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
eff0: 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  !=fts5LeafFirstT
f000: 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c  ermOff(pIter->pL
f010: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
f020: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
f030: 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
f040: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
f050: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeep);.      }.
f060: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
f070: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f080: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
f090: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
f0a0: 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
f0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
f0c0: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
f0d0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  0;.      const c
f0e0: 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a  har *zTerm = 0;.
f0f0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
f100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
f110: 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
f120: 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20  ->pHash);.      
f130: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
f140: 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73  canEntry(p->pHas
f150: 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73  h, &zTerm, &pLis
f160: 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
f170: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f180: 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f   goto next_none_
f190: 65 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 72  eof;.      pIter
f1a0: 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38  ->pLeaf->p = (u8
f1b0: 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  *)pList;.      p
f1c0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
f1d0: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
f1e0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
f1f0: 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
f200: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
f210: 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 3b  Doclist = nList;
f220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
f230: 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
f240: 72 63 2c 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  rc,&pIter->term,
f250: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65   (int)strlen(zTe
f260: 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29  rm), (u8*)zTerm)
f270: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f280: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
f290: 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74  5GetVarint(pList
f2a0: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
f2b0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
f2c0: 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
f2d0: 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
f2e0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
f2f0: 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f   goto next_none_
f300: 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  eof;.  }..  fts5
f310: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
f320: 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 72 65  p, pIter);..  re
f330: 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65  turn;. next_none
f340: 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44 61 74 61  _eof:.  fts5Data
f350: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
f360: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
f370: 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  pLeaf = 0;.}.../
f380: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
f390: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
f3a0: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
f3b0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
f3c0: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
f3d0: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
f3e0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
f3f0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a  error code. It .
f400: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
f410: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
f420: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
f430: 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e  aches EOF. If an
f440: 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
f450: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
f460: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
f470: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
f480: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
f490: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
f4a0: 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46  SegIterNext(.  F
f4b0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f4d0: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
f4e0: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
f4f0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
f500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
f510: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
f520: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65  e */.  int *pbNe
f530: 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  wTerm           
f540: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
f550: 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20  et for new term 
f560: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  */.){.  Fts5Data
f570: 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
f580: 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f  >pLeaf;.  int iO
f590: 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77 54 65  ff;.  int bNewTe
f5a0: 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  rm = 0;.  int nK
f5b0: 65 65 70 20 3d 20 30 3b 0a 20 20 75 38 20 2a 61  eep = 0;.  u8 *a
f5c0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73  ;.  int n;..  as
f5d0: 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d  sert( pbNewTerm=
f5e0: 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d  =0 || *pbNewTerm
f5f0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
f600: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
f610: 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
f620: 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20  L_NONE );..  /* 
f630: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 65  Search for the e
f640: 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  nd of the positi
f650: 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20 74  on list within t
f660: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
f670: 20 2a 2f 0a 20 20 61 20 3d 20 70 4c 65 61 66 2d   */.  a = pLeaf-
f680: 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c 65 61 66 2d  >p;.  n = pLeaf-
f690: 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53 45  >szLeaf;..  ASSE
f6a0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
f6b0: 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49  af);.  iOff = pI
f6c0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f6d0: 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a   + pIter->nPos;.
f6e0: 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b  .  if( iOff<n ){
f6f0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
f700: 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65   entry is on the
f710: 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a   current page. *
f720: 2f 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  /.    assert_nc(
f730: 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45   iOff<=pIter->iE
f740: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20  ndofDoclist );. 
f750: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74     if( iOff>=pIt
f760: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f770: 74 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77 54  t ){.      bNewT
f780: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  erm = 1;.      i
f790: 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61  f( iOff!=fts5Lea
f7a0: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
f7b0: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
f7c0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
f7d0: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
f7e0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
f7f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f800: 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20     u64 iDelta;. 
f810: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
f820: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
f830: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
f840: 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74 65  lta);.      pIte
f850: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
f860: 6c 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lta;.      asser
f870: 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20 29  t_nc( iDelta>0 )
f880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
f890: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f8a0: 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65 20   iOff;..  }else 
f8b0: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
f8c0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
f8d0: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
f8e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f8f0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Term = 0;.    in
f900: 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t nList = 0;.   
f910: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
f920: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
f930: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c  GITER_ONETERM) |
f940: 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20  | pbNewTerm );. 
f950: 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72     if( 0==(pIter
f960: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f970: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
f980: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f990: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
f9a0: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
f9b0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
f9c0: 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48  hScanEntry(p->pH
f9d0: 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c  ash, &zTerm, &pL
f9e0: 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
f9f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
fa00: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  t==0 ){.      ft
fa10: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
fa20: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
fa30: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
fa40: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
fa50: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
fa60: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
fa70: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
fa80: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
fa90: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
faa0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d  >pLeaf->szLeaf =
fab0: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
fac0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
fad0: 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20  st = nList+1;.  
fae0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
faf0: 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
fb00: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28   &pIter->term, (
fb10: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d  int)strlen(zTerm
fb20: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75 38  ),.          (u8
fb30: 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
fb40: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fb50: 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
fb60: 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29  nt(pList, (u64*)
fb70: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
fb80: 0a 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72  .      *pbNewTer
fb90: 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  m = 1;.    }.  }
fba0: 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20 3d  else{.    iOff =
fbb0: 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20   0;.    /* Next 
fbc0: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20  entry is not on 
fbd0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
fbe0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69   */.    while( i
fbf0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
fc00: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
fc10: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
fc20: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
fc30: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
fc40: 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
fc50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53 53  break;.      ASS
fc60: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
fc70: 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eaf);.      if( 
fc80: 28 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  (iOff = fts5Leaf
fc90: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
fca0: 65 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70 4c  eaf)) && iOff<pL
fcb0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fcc0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
fcd0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
fce0: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
fcf0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
fd00: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
fd10: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
fd20: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
fd30: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
fd40: 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c  f->nn>pLeaf->szL
fd50: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
fd60: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
fd70: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
fd80: 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  f + fts5GetVarin
fd90: 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20  t32(.           
fda0: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
fdb0: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49 74  af->szLeaf], pIt
fdc0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fdd0: 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
fde0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fdf0: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
fe00: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
fe10: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fe20: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
fe30: 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  Off = pLeaf->szL
fe40: 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72  eaf + fts5GetVar
fe50: 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20  int32(.         
fe60: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
fe70: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66  af->szLeaf], iOf
fe80: 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  f.        );.   
fe90: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
fea0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
feb0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fec0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69  EndofDoclist = i
fed0: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 62 4e 65  Off;.        bNe
fee0: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
fef0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f   }.      assert_
ff00: 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  nc( iOff<pLeaf->
ff10: 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  szLeaf );.      
ff20: 69 66 28 20 69 4f 66 66 3e 70 4c 65 61 66 2d 3e  if( iOff>pLeaf->
ff30: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
ff40: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
ff50: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
ff60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
ff70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ff80: 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65  Check if the ite
ff90: 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20  rator is now at 
ffa0: 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75  EOF. If so, retu
ffb0: 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
ffc0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
ffd0: 29 7b 0a 20 20 20 20 69 66 28 20 62 4e 65 77 54  ){.    if( bNewT
ffe0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  erm ){.      if(
fff0: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
10000 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
10010 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  TERM ){.        
10020 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
10030 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
10040 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
10050 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  eaf = 0;.      }
10060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
10070 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
10080 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65  m(p, pIter, nKee
10090 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
100a0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
100b0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
100c0 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
100d0 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
100e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
100f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
10100 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75  he following cou
10110 6c 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63 61  ld be done by ca
10120 6c 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74 65  lling fts5SegIte
10130 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75 74  rLoadNPos(). But
10140 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62  .      ** this b
10150 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75 6c  lock is particul
10160 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63 65  arly performance
10170 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65 71   critical, so eq
10180 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a  uivalent.      *
10190 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  * code is inline
101a0 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
101b0 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77 69     ** Later: Swi
101c0 74 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66 74  tched back to ft
101d0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
101e0 73 28 29 20 62 65 63 61 75 73 65 20 69 74 20 73  s() because it s
101f0 75 70 70 6f 72 74 73 0a 20 20 20 20 20 20 2a 2a  upports.      **
10200 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64   detail=none mod
10210 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20 20  e. Not ideal..  
10220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
10230 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61 73 73 65   nSz;.      asse
10240 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
10250 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
10260 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c 65  sert( pIter->iLe
10270 61 66 4f 66 66 73 65 74 3c 3d 70 49 74 65 72 2d  afOffset<=pIter-
10280 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 3b 0a 20 20  >pLeaf->nn );.  
10290 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
102a0 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70  arint32(pIter->p
102b0 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e  Leaf->p, pIter->
102c0 69 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a  iLeafOffset, nSz
102d0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
102e0 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78  bDel = (nSz & 0x
102f0 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74  0001);.      pIt
10300 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e  er->nPos = nSz>>
10310 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  1;.      assert_
10320 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e  nc( pIter->nPos>
10330 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
10340 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56  }..#define SWAPV
10350 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20  AL(T, a, b) { T 
10360 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b  tmp; tmp=a; a=b;
10370 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69   b=tmp; }..#defi
10380 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70  ne fts5IndexSkip
10390 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20  Varint(a, iOff) 
103a0 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20  {            \. 
103b0 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66   int iEnd = iOff
103c0 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  +9;             
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69   \.  while( (a[i
103f0 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26  Off++] & 0x80) &
10400 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20  & iOff<iEnd );  
10410 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20       \.}../*.** 
10420 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
10430 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
10440 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
10450 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e  id in a doclist.
10460 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
10470 6e 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61  n sets the itera
10480 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69  tor up so that i
10490 74 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72  terates in rever
104a0 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68  se order through
104b0 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e  .** the doclist.
104c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
104d0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
104e0 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  se(Fts5Index *p,
104f0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
10500 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  ter){.  Fts5Dlid
10510 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
10520 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
10530 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74   Fts5Data *pLast
10540 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f   = 0;.  int pgno
10550 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Last = 0;..  if(
10560 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69   pDlidx ){.    i
10570 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
10580 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
10590 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20  .    pgnoLast = 
105a0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
105b0 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70  o(pDlidx);.    p
105c0 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52  Last = fts5DataR
105d0 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
105e0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
105f0 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
10600 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44  }else{.    Fts5D
10610 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
10620 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20  er->pLeaf;      
10630 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
10640 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20  af data */..    
10650 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74  /* Currently, Ft
10660 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
10670 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
10680 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
10690 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  f.    ** positio
106a0 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66  n-list content f
106b0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
106c0 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70  owid. Back it up
106d0 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20   so that it.    
106e0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
106f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f   start of the po
10700 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
10710 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69   field. */.    i
10720 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20  nt iPoslist;.   
10730 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72   if( pIter->iTer
10740 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72  mLeafPgno==pIter
10750 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
10760 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20       iPoslist = 
10770 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
10780 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73  Offset;.    }els
10790 65 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73  e{.      iPoslis
107a0 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 4;.    }.   
107b0 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61   fts5IndexSkipVa
107c0 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69  rint(pLeaf->p, i
107d0 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49  Poslist);.    pI
107e0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
107f0 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20   = iPoslist;..  
10800 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e    /* If this con
10810 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74  dition is true t
10820 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  hen the largest 
10830 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  rowid for the cu
10840 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72  rrent.    ** ter
10850 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f  m may not be sto
10860 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  red on the curre
10870 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72  nt page. So sear
10880 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20  ch forward to.  
10890 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73    ** see where s
108a0 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79  aid rowid really
108b0 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28   is.  */.    if(
108c0 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
108d0 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a  clist>=pLeaf->sz
108e0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e  Leaf ){.      in
108f0 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74  t pgno;.      Ft
10900 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
10910 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
10920 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f  ->pSeg;..      /
10930 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64  * The last rowid
10940 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
10950 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68  may not be on th
10960 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
10970 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20  Search.      ** 
10980 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20  forward to find 
10990 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
109a0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77  ing the last row
109b0 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  id.  */.      fo
109c0 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c  r(pgno=pIter->iL
109d0 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72  eafPgno+1; !p->r
109e0 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d  c && pgno<=pSeg-
109f0 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b  >pgnoLast; pgno+
10a00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  +){.        i64 
10a10 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d  iAbs = FTS5_SEGM
10a20 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
10a30 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20  iSegid, pgno);. 
10a40 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20         Fts5Data 
10a50 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61  *pNew = fts5Data
10a60 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20  Read(p, iAbs);. 
10a70 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
10a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
10a90 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65   iRowid, bTermle
10aa0 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52  ss;.          iR
10ab0 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46  owid = fts5LeafF
10ac0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65  irstRowidOff(pNe
10ad0 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54  w);.          bT
10ae0 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65  ermless = fts5Le
10af0 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65  afIsTermless(pNe
10b00 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
10b10 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ( iRowid ){.    
10b20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28          SWAPVAL(
10b30 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c  Fts5Data*, pNew,
10b40 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20   pLast);.       
10b50 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20       pgnoLast = 
10b60 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  pgno;.          
10b70 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  }.          fts5
10b80 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
10b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10ba0 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20   bTermless==0 ) 
10bb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10bd0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73   }..  /* If pLas
10be0 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69  t is NULL at thi
10bf0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
10c00 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72  e last rowid for
10c10 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20   this doclist.  
10c20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  ** lies on the p
10c30 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  age currently in
10c40 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
10c50 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73  terator. In this
10c60 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65   case .  ** pIte
10c70 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69  r->iLeafOffset i
10c80 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
10c90 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f   point to the po
10ca0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
10cb0 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f  .  ** field asso
10cc0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10cd0 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72  first relevant r
10ce0 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
10cf0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20  ..  **.  ** Or, 
10d00 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d  if pLast is non-
10d10 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
10d20 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63   the page that c
10d30 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74  ontains the last
10d40 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20  .  ** rowid. In 
10d50 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67  this case config
10d60 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ure the iterator
10d70 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
10d80 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  ts to the.  ** f
10d90 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
10da0 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  is page..  */.  
10db0 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20  if( pLast ){.   
10dc0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66   int iOff;.    f
10dd0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
10de0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
10df0 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
10e00 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65   pLast;.    pIte
10e10 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  r->iLeafPgno = p
10e20 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66  gnoLast;.    iOf
10e30 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
10e40 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29  tRowidOff(pLast)
10e50 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
10e60 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61  s5GetVarint(&pLa
10e70 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  st->p[iOff], (u6
10e80 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
10e90 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
10ea0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
10eb0 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35  f;..    if( fts5
10ec0 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
10ed0 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Last) ){.      p
10ee0 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
10ef0 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b  ist = pLast->nn+
10f00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10f10 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
10f20 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c  fDoclist = fts5L
10f30 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
10f40 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLast);.    }.. 
10f50 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
10f60 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
10f70 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
10f80 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
10f90 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
10fa0 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
10fb0 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63  t rowid of a doc
10fc0 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69  list..** There i
10fd0 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
10fe0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
10ff0 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d  h the final term
11000 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
11010 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65  .** page. If the
11020 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
11030 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f   the last term o
11040 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64  n the page, load
11050 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74   the .** doclist
11060 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b  -index from disk
11070 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
11080 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 28  an iterator at (
11090 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a  pIter->pDlidx)..
110a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
110b0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
110c0 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
110d0 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
110e0 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65  Iter){.  int iSe
110f0 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  g = pIter->pSeg-
11100 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62  >iSegid;.  int b
11110 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
11120 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
11130 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
11140 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
11150 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f   pIter->pLeaf; /
11160 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
11170 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ata */..  assert
11180 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
11190 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
111a0 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72  ETERM );.  asser
111b0 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t( pIter->pDlidx
111c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
111d0 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ck if the curren
111e0 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f  t doclist ends o
111f0 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20  n this page. If 
11200 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a  it does, return.
11210 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f    ** early witho
11220 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  ut loading the d
11230 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73  oclist-index (as
11240 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61   it belongs to a
11250 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
11260 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70  term. */.  if( p
11270 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
11280 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno==pIter->iLea
11290 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74  fPgno .   && pIt
112a0 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
112b0 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  t<pLeaf->szLeaf 
112c0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
112d0 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
112e0 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69  pDlidx = fts5Dli
112f0 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52  dxIterInit(p, bR
11300 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d  ev, iSeg, pIter-
11310 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
11320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
11330 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
11340 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11350 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
11360 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ently contains.*
11370 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65  * no valid value
11380 73 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  s except for the
11390 20 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65   Fts5SegIter.pLe
113a0 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  af member variab
113b0 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  le. This.** func
113c0 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68  tion searches th
113d0 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20  e leaf page for 
113e0 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20  a term matching 
113f0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a  (pTerm/nTerm)..*
11400 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63  *.** If the spec
11410 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f  ified term is fo
11420 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  und on the page,
11430 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
11440 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
11450 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66  inting to it. If
11460 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73   argument bGe is
11470 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65   zero and the te
11480 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  rm is not found,
11490 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72  .** the iterator
114a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
114b0 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  g at EOF..**.** 
114c0 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65  If bGe is non-ze
114d0 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ro and the speci
114e0 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74  fied term is not
114f0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
11500 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20  .** iterator is 
11510 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
11520 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65   the smallest te
11530 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
11540 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  t that.** is lar
11550 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65  ger than the spe
11560 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65  cified term, eve
11570 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69  n if this term i
11580 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20  s not on the.** 
11590 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f  current page..*/
115a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
115b0 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73  5LeafSeek(.  Fts
115c0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115e0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
115f0 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  code here */.  i
11600 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20  nt bGe,         
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11620 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20  * True for a >= 
11630 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35  search */.  Fts5
11640 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
11650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11660 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20  terator to seek 
11670 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
11680 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20  Term, int nTerm 
11690 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
116a0 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b  search for */.){
116b0 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63  .  int iOff;.  c
116c0 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74  onst u8 *a = pIt
116d0 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
116e0 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74  int szLeaf = pIt
116f0 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
11700 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  f;.  int n = pIt
11710 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a  er->pLeaf->nn;..
11720 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30    int nMatch = 0
11730 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
11740 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  0;.  int nNew = 
11750 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  0;.  int iTermOf
11760 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b  f;.  int iPgidx;
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
11790 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20  offset in pgidx 
117a0 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50  */.  int bEndOfP
117b0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
117c0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
117d0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64  E_OK );..  iPgid
117e0 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50  x = szLeaf;.  iP
117f0 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
11800 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
11810 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  x], iTermOff);. 
11820 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
11830 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20 29  ;.  if( iOff>n )
11840 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
11850 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
11860 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77  return;.  }..  w
11870 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
11880 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
11890 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73  w many new bytes
118a0 20 61 72 65 20 69 6e 20 74 68 69 73 20 74 65 72   are in this ter
118b0 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73  m */.    fts5Fas
118c0 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  tGetVarint32(a, 
118d0 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  iOff, nNew);.   
118e0 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63   if( nKeep<nMatc
118f0 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  h ){.      goto 
11900 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
11910 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
11920 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20  ( nKeep>=nMatch 
11930 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70  );.    if( nKeep
11940 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
11950 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
11960 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e    int i;.      n
11970 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20  Cmp = MIN(nNew, 
11980 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20  nTerm-nMatch);. 
11990 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
119a0 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
119b0 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69      if( a[iOff+i
119c0 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b  ]!=pTerm[nMatch+
119d0 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  i] ) break;.    
119e0 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68    }.      nMatch
119f0 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66   += i;..      if
11a00 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20  ( nTerm==nMatch 
11a10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
11a20 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ==nNew ){.      
11a30 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
11a40 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20  success;.       
11a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11a60 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
11a70 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
11a80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11a90 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66  i<nNew && a[iOff
11aa0 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68  +i]>pTerm[nMatch
11ab0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ] ){.        got
11ac0 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b  o search_failed;
11ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11ae0 20 20 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d      if( iPgidx>=
11af0 6e 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f  n ){.      bEndO
11b00 66 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20  fPage = 1;.     
11b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11b20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73     iPgidx += fts
11b30 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
11b40 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b  iPgidx], nKeep);
11b50 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d  .    iTermOff +=
11b60 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66 66   nKeep;.    iOff
11b70 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20   = iTermOff;..  
11b80 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b    if( iOff>=n ){
11b90 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
11ba0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
11bb0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
11bc0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
11bd0 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f 66  e nKeep field of
11be0 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e 20   the next term. 
11bf0 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74 47  */.    fts5FastG
11c00 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f  etVarint32(a, iO
11c10 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a  ff, nKeep);.  }.
11c20 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3a  . search_failed:
11c30 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20 29 7b  .  if( bGe==0 ){
11c40 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
11c50 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
11c60 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
11c70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 72 65  Leaf = 0;.    re
11c80 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
11c90 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29 7b 0a  ( bEndOfPage ){.
11ca0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 66      do {.      f
11cb0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
11cc0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
11cd0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
11ce0 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
11cf0 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74 65  ;.      a = pIte
11d00 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
11d10 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
11d20 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72 2d  sTermless(pIter-
11d30 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20 20  >pLeaf)==0 ){.  
11d40 20 20 20 20 20 20 69 50 67 69 64 78 20 3d 20 70        iPgidx = p
11d50 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
11d60 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69 50 67  eaf;.        iPg
11d70 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
11d80 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 70  rint32(&pIter->p
11d90 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78 5d 2c  Leaf->p[iPgidx],
11da0 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20   iOff);.        
11db0 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f  if( iOff<4 || iO
11dc0 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
11dd0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
11de0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
11df0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
11e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11e10 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a       nKeep = 0;.
11e20 20 20 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f            iTermO
11e30 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  ff = iOff;.     
11e40 20 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e       n = pIter->
11e50 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20  pLeaf->nn;.     
11e60 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
11e70 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
11e80 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
11e90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11eb0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31 20 29  .    }while( 1 )
11ec0 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73  ;.  }.. search_s
11ed0 75 63 63 65 73 73 3a 0a 0a 20 20 70 49 74 65 72  uccess:..  pIter
11ee0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
11ef0 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20 20 70  iOff + nNew;.  p
11f00 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
11f10 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69  ffset = pIter->i
11f20 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 70 49  LeafOffset;.  pI
11f30 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
11f40 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
11f50 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75  fPgno;..  fts5Bu
11f60 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
11f70 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b  &pIter->term, nK
11f80 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66  eep, pTerm);.  f
11f90 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
11fa0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  lob(&p->rc, &pIt
11fb0 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20  er->term, nNew, 
11fc0 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66  &a[iOff]);..  if
11fd0 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20  ( iPgidx>=n ){. 
11fe0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
11ff0 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
12000 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
12010 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
12020 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67 69 64  Extra;.    iPgid
12030 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  x += fts5GetVari
12040 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c  nt32(&a[iPgidx],
12050 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49   nExtra);.    pI
12060 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
12070 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20  st = iTermOff + 
12080 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49  nExtra;.  }.  pI
12090 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
120a0 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74 73 35   iPgidx;..  fts5
120b0 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
120c0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
120d0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
120e0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  s(p, pIter);.}..
120f0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
12100 74 6d 74 20 2a 66 74 73 35 49 64 78 53 65 6c 65  tmt *fts5IdxSele
12110 63 74 53 74 6d 74 28 46 74 73 35 49 6e 64 65 78  ctStmt(Fts5Index
12120 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
12130 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  IdxSelect==0 ){.
12140 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
12150 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
12160 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
12170 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
12180 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  , &p->pIdxSelect
12190 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
121a0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  f(.          "SE
121b0 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27  LECT pgno FROM '
121c0 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45  %q'.'%q_idx' WHE
121d0 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  RE ".          "
121e0 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d  segid=? AND term
121f0 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65 72  <=? ORDER BY ter
12200 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c  m DESC LIMIT 1",
12210 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
12220 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
12230 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
12240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
12250 70 49 64 78 53 65 6c 65 63 74 3b 0a 7d 0a 0a 2f  pIdxSelect;.}../
12260 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
12270 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
12280 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
12290 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
122a0 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20  thin segment.** 
122b0 70 53 65 67 2e 20 49 66 20 74 68 65 72 65 20 69  pSeg. If there i
122c0 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
122d0 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65  n the index, the
122e0 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74   iterator is set
122f0 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   to EOF..**.** I
12300 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12310 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
12320 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
12330 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
12340 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
12350 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
12360 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
12370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12380 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
12390 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
123a0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
123b0 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73  rSeekInit(.  Fts
123c0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123e0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  FTS5 backend */.
123f0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
12400 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
12410 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
12420 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
12430 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
12440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
12450 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
12460 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
12470 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
12480 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
12490 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
124a0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
124b0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
124d0 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
124e0 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
124f0 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47  Pg = 1;.  int bG
12500 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53  e = (flags & FTS
12510 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
12520 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78  N);.  int bDlidx
12530 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12540 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12550 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
12560 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 73  ist-index */.  s
12570 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
12580 78 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  xSelect = 0;..  
12590 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c  assert( bGe==0 |
125a0 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
125b0 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29  NDEX_QUERY_DESC)
125c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
125d0 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20   pTerm && nTerm 
125e0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  );.  memset(pIte
125f0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
12600 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
12610 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20  pSeg = pSeg;..  
12620 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
12630 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ts stack variabl
12640 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61  e iPg to the lea
12650 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  f page number th
12660 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74  at may.  ** cont
12670 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ain term (pTerm/
12680 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73  nTerm), if it is
12690 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
126a0 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 70 49  segment. */.  pI
126b0 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73 35 49  dxSelect = fts5I
126c0 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70 29 3b  dxSelectStmt(p);
126d0 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
126e0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
126f0 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65  _bind_int(pIdxSe
12700 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69  lect, 1, pSeg->i
12710 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Segid);.  sqlite
12720 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78  3_bind_blob(pIdx
12730 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d  Select, 2, pTerm
12740 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f  , nTerm, SQLITE_
12750 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53  STATIC);.  if( S
12760 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
12770 65 33 5f 73 74 65 70 28 70 49 64 78 53 65 6c 65  e3_step(pIdxSele
12780 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20 76  ct) ){.    i64 v
12790 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
127a0 75 6d 6e 5f 69 6e 74 28 70 49 64 78 53 65 6c 65  umn_int(pIdxSele
127b0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20  ct, 0);.    iPg 
127c0 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b  = (int)(val>>1);
127d0 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76  .    bDlidx = (v
127e0 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  al & 0x0001);.  
127f0 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  }.  p->rc = sqli
12800 74 65 33 5f 72 65 73 65 74 28 70 49 64 78 53 65  te3_reset(pIdxSe
12810 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
12820 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64 78 53  _bind_null(pIdxS
12830 65 6c 65 63 74 2c 20 32 29 3b 0a 0a 20 20 69 66  elect, 2);..  if
12840 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f  ( iPg<pSeg->pgno
12850 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67  First ){.    iPg
12860 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
12870 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d  st;.    bDlidx =
12880 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72   0;.  }..  pIter
12890 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  ->iLeafPgno = iP
128a0 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67  g - 1;.  fts5Seg
128b0 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
128c0 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  pIter);..  if( p
128d0 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
128e0 20 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28     fts5LeafSeek(
128f0 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70  p, bGe, pIter, p
12900 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
12910 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
12920 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65  SQLITE_OK && bGe
12930 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ==0 ){.    pIter
12940 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
12950 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
12960 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
12970 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  pLeaf ){.      i
12980 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
12990 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
129a0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
129b0 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
129c0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
129d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
129e0 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( bDlidx ){.   
129f0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
12a00 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74  LoadDlidx(p, pIt
12a10 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
12a20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
12a30 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
12a40 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ESC ){.        f
12a50 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
12a60 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
12a70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
12a80 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74    fts5SegIterSet
12a90 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
12aa0 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20  .  /* Either:.  
12ab0 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20  **.  **   1) an 
12ac0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
12ad0 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29  ed, or.  **   2)
12ae0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12af0 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a  ints to EOF, or.
12b00 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74    **   3) the it
12b10 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
12b20 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74   an entry with t
12b30 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
12b40 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20  ), or.  **   4) 
12b50 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  the FTS5INDEX_QU
12b60 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61  ERY_SCAN flag wa
12b70 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 69 74  s set and the it
12b80 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20  erator points.  
12b90 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e  **      to an en
12ba0 74 72 79 20 77 69 74 68 20 61 20 74 65 72 6d 20  try with a term 
12bb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
12bc0 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f  equal to (pTerm/
12bd0 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61  nTerm)..  */.  a
12be0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
12bf0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70   /* 1 */.   || p
12c30 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20  Iter->pLeaf==0  
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c70 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42  2 */.   || fts5B
12c80 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
12c90 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
12ca0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20  Term, nTerm)==0 
12cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f           /* 3 */
12cc0 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66  .   || (bGe && f
12cd0 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
12ce0 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72  Blob(&pIter->ter
12cf0 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, pTerm, nTerm)
12d00 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29  >0)  /* 4 */.  )
12d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
12d20 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
12d30 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
12d40 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
12d50 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a  erm within the.*
12d60 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  * in-memory hash
12d70 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65   table. If there
12d80 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
12d90 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
12da0 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72  le, the .** iter
12db0 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45  ator is set to E
12dc0 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  OF..**.** If an 
12dd0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
12de0 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
12df0 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
12e00 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
12e10 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
12e20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
12e30 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
12e40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12e50 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
12e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12e70 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
12e80 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
12e90 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
12ea0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
12eb0 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e  backend */.  con
12ec0 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
12ed0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
12ee0 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
12ef0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
12f20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
12f30 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ags */.  Fts5Seg
12f40 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
12f50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
12f60 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
12f70 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
12f80 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e  *pList = 0;.  in
12f90 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63  t nList = 0;.  c
12fa0 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a  onst u8 *z = 0;.
12fb0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20    int n = 0;..  
12fc0 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
12fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
12fe0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12ff0 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  ;..  if( pTerm==
13000 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
13010 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
13020 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  AN) ){.    p->rc
13030 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
13040 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48  shScanInit(p->pH
13050 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
13060 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  *)pTerm, nTerm);
13070 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
13080 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d  HashScanEntry(p-
13090 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63  >pHash, (const c
130a0 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74  har**)&z, &pList
130b0 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e  , &nList);.    n
130c0 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72   = (z ? (int)str
130d0 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  len((const char*
130e0 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73  )z) : 0);.  }els
130f0 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  e{.    pIter->fl
13100 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
13110 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20  TER_ONETERM;.   
13120 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
13130 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Query(p->pHash, 
13140 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65  (const char*)pTe
13150 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73  rm, nTerm, &pLis
13160 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
13170 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e  z = pTerm;.    n
13180 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20   = nTerm;.  }.. 
13190 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
131a0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
131b0 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  f;.    sqlite3Ft
131c0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
131d0 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
131e0 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65  , n, z);.    pLe
131f0 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  af = fts5IdxMall
13200 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
13210 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28  5Data));.    if(
13220 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75   pLeaf==0 ) retu
13230 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70  rn;.    pLeaf->p
13240 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
13250 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70     pLeaf->nn = p
13260 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e  Leaf->szLeaf = n
13270 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  List;.    pIter-
13280 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a  >pLeaf = pLeaf;.
13290 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
132a0 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
132b0 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c  Varint(pLeaf->p,
132c0 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
132d0 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65  Rowid);.    pIte
132e0 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
132f0 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20   = pLeaf->nn;.. 
13300 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
13310 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
13320 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ESC ){.      pIt
13330 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
13340 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
13350 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  E;.      fts5Seg
13360 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
13370 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
13380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13390 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
133a0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
133b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
133c0 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70  SegIterSetNext(p
133d0 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
133e0 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72  ** Zero the iter
133f0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
13400 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
13410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13420 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
13430 72 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  r(Fts5SegIter *p
13440 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66  Iter){.  fts5Buf
13450 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
13460 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74  term);.  fts5Dat
13470 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
13480 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61  pLeaf);.  fts5Da
13490 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
134a0 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66  >pNextLeaf);.  f
134b0 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
134c0 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  (pIter->pDlidx);
134d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
134e0 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
134f0 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  set);.  memset(p
13500 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
13510 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d  Fts5SegIter));.}
13520 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13530 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  DEBUG../*.** Thi
13540 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
13550 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
13560 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70  e big assert() p
13570 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65  rocedure impleme
13580 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41  nted by.** fts5A
13590 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
135a0 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65  tup(). It ensure
135b0 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  s that the resul
135c0 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
135d0 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69  ed.** in *pRes i
135e0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  s the correct re
135f0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
13600 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
13610 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a  sitions of the.*
13620 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e  * two iterators.
13630 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13640 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
13650 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74  isonResult(.  Ft
13660 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  s5Iter *pIter, .
13670 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13680 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  1,.  Fts5SegIter
13690 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73   *p2,.  Fts5CRes
136a0 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69  ult *pRes.){.  i
136b0 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74  nt i1 = p1 - pIt
136c0 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20  er->aSeg;.  int 
136d0 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d  i2 = p2 - pIter-
136e0 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31  >aSeg;..  if( p1
136f0 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70  ->pLeaf || p2->p
13700 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
13710 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  p1->pLeaf==0 ){.
13720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13730 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29  es->iFirst==i2 )
13740 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13750 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  p2->pLeaf==0 ){.
13760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13770 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
13780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13790 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49     int nMin = MI
137a0 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32  N(p1->term.n, p2
137b0 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20  ->term.n);.     
137c0 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
137d0 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32  p(p1->term.p, p2
137e0 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b  ->term.p, nMin);
137f0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
13800 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65  0 ) res = p1->te
13810 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e  rm.n - p2->term.
13820 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65  n;..      if( re
13830 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
13840 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
13850 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  ermEq==1 );.    
13860 20 20 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e      assert( p1->
13870 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77  iRowid!=p2->iRow
13880 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  id );.        re
13890 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
138a0 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
138b0 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
138c0 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  1 : 1;.      }el
138d0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
138e0 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
138f0 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  q==0 );.      }.
13900 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
13910 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13920 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
13930 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65  ==i1 );.      }e
13940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
13950 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13960 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d  t==i2 );.      }
13970 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13980 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13990 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
139a0 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47  ess SQLITE_DEBUG
139b0 20 69 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e   is defined when
139c0 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20   this module.** 
139d0 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20  is compiled. In 
139e0 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
139f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65  function is esse
13a00 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72  ntially an asser
13a10 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
13a20 74 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  t used to verify
13a30 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
13a40 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
13a50 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a  >aFirst[] array.
13a60 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ** are correct..
13a70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13a80 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
13a90 65 72 53 65 74 75 70 28 46 74 73 35 49 6e 64 65  erSetup(Fts5Inde
13aa0 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a  x *p, Fts5Iter *
13ab0 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
13ac0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13ad0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
13ae0 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74  r *pFirst = &pIt
13af0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13b00 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
13b10 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ];.    int i;.
13b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46  .    assert( (pF
13b30 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d  irst->pLeaf==0)=
13b40 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f  =pIter->base.bEo
13b50 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  f );..    /* Che
13b60 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69  ck that pIter->i
13b70 53 77 69 74 63 68 52 6f 77 69 64 20 69 73 20 73  SwitchRowid is s
13b80 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
13b90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13ba0 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
13bb0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
13bc0 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
13bd0 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
13be0 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46    assert( p1==pF
13bf0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  irst .          
13c00 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30   || p1->pLeaf==0
13c10 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13c20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
13c30 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c  e(&pFirst->term,
13c40 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20   &p1->term) .   
13c50 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69          || p1->i
13c60 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53  Rowid==pIter->iS
13c70 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20  witchRowid.     
13c80 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52        || (p1->iR
13c90 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69  owid<pIter->iSwi
13ca0 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
13cb0 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a  ->bRev.      );.
13cc0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
13cd0 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
13ce0 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  g; i+=2){.      
13cf0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
13d00 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13d10 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
13d20 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
13d30 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20  r->aSeg[i+1];.  
13d40 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
13d50 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
13d60 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e  aFirst[(pIter->n
13d70 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20  Seg + i) / 2];. 
13d80 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
13d90 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
13da0 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
13db0 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Res);.    }..   
13dc0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74   for(i=1; i<(pIt
13dd0 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69  er->nSeg / 2); i
13de0 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
13df0 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
13e00 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13e10 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69  r->aFirst[i*2].i
13e20 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
13e30 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
13e40 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
13e50 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
13e60 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  +1].iFirst ];.  
13e70 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
13e80 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
13e90 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20  aFirst[i];.     
13ea0 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
13eb0 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
13ec0 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
13ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13ee0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
13ef0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
13f00 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69  Setup(x,y).#endi
13f10 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20  f../*.** Do the 
13f20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73  comparison neces
13f30 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65  sary to populate
13f40 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13f50 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Out]..**.** If t
13f60 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
13f70 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
13f80 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e  hen it is the in
13f90 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a  dex of an entry.
13fa0 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ** in the pIter-
13fb0 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68  >aSeg[] array th
13fc0 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74  at is (a) not at
13fd0 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f   EOF, and (b) po
13fe0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b  inting.** to a k
13ff0 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70  ey that is a dup
14000 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
14010 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69  r, higher priori
14020 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d  ty, .** segment-
14030 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  iterator in the 
14040 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72  pSeg->aSeg[] arr
14050 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
14060 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  t fts5MultiIterD
14070 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65  oCompare(Fts5Ite
14080 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f  r *pIter, int iO
14090 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20  ut){.  int i1;  
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
140c0 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73  of left-hand Fts
140d0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
140e0 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20  t i2;           
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14100 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
14110 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
14120 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a   */.  int iRes;.
14130 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14140 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
14150 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46    /* Left-hand F
14160 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
14170 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b  Fts5SegIter *p2;
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74  /* Right-hand Ft
141a0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
141b0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
141c0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
141d0 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65  t[iOut];..  asse
141e0 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e  rt( iOut<pIter->
141f0 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29  nSeg && iOut>0 )
14200 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
14210 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49  r->bRev==0 || pI
14220 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a  ter->bRev==1 );.
14230 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49  .  if( iOut>=(pI
14240 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a  ter->nSeg/2) ){.
14250 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d      i1 = (iOut -
14260 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20   pIter->nSeg/2) 
14270 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31  * 2;.    i2 = i1
14280 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
14290 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61     i1 = pIter->a
142a0 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46  First[iOut*2].iF
142b0 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70  irst;.    i2 = p
142c0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
142d0 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  t*2+1].iFirst;. 
142e0 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72   }.  p1 = &pIter
142f0 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32  ->aSeg[i1];.  p2
14300 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
14310 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54  i2];..  pRes->bT
14320 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28  ermEq = 0;.  if(
14330 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
14340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
14350 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p1 is at EOF */
14360 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a  .    iRes = i2;.
14370 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
14380 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
14390 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45  /* If p2 is at E
143a0 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
143b0 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i1;.  }else{.  
143c0 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35    int res = fts5
143d0 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
143e0 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65  1->term, &p2->te
143f0 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  rm);.    if( res
14400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
14410 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20  ert( i2>i1 );.  
14420 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d      assert( i2!=
14430 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d  0 );.      pRes-
14440 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20  >bTermEq = 1;.  
14450 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77      if( p1->iRow
14460 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id==p2->iRowid )
14470 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44  {.        p1->bD
14480 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20  el = p2->bDel;. 
14490 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32         return i2
144a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
144b0 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
144c0 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
144d0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
144e0 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
144f0 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
14500 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
14510 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
14520 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
14530 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
14540 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
14550 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
14560 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74  (u16)iRes;.  ret
14570 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14580 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
14590 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
145a0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
145b0 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
145c0 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
145d0 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
145e0 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f  eaf iLeafPgno do
145f0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
14600 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69  contains no rowi
14610 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
14620 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
14630 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
14640 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
14650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14660 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
14670 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
14680 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
14690 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
146a0 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
146b0 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
146c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
146d0 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
146e0 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66  eafPgno );..  if
146f0 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
14700 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  r->pSeg->pgnoLas
14710 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
14720 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
14730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
14740 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
14750 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
14760 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
14770 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  eaf = 0;.    pIt
14780 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
14790 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20  iLeafPgno-1;.   
147a0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
147b0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
147c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
147d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
147e0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
147f0 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
14800 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14820 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
14830 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
14840 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
14850 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
14860 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
14870 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
14880 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
14890 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
148a0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
148b0 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
148c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
148d0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
148e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
148f0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
14900 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
14910 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
14920 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
14930 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
14940 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
14950 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
14960 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
14970 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
14980 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14990 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
149a0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
149b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
149c0 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
149d0 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
149e0 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
149f0 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
14a00 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
14a10 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
14a20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
14a30 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
14a40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14a50 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
14a60 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
14a70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14a80 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14a90 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
14aa0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
14ab0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
14ac0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
14ad0 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
14ae0 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14b00 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
14b10 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
14b20 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
14b30 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
14b40 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
14b50 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
14b60 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
14b70 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
14b80 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
14b90 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
14ba0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
14bb0 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
14bc0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
14bd0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
14be0 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
14bf0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
14c00 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
14c10 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
14c20 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
14c30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   ){.    while( !
14c40 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
14c50 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
14c60 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49  Match>fts5DlidxI
14c70 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
14c80 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50   ){.      iLeafP
14c90 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
14ca0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
14cb0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
14cc0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
14cd0 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
14ce0 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50  ssert_nc( iLeafP
14cf0 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
14d00 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
14d10 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
14d20 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
14d30 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
14d40 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
14d50 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
14d60 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
14d70 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
14d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
14d90 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  rt( pIter->pNext
14da0 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Leaf==0 );.    a
14db0 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49  ssert( iMatch<pI
14dc0 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  ter->iRowid );. 
14dd0 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
14de0 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14df0 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
14e00 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  <fts5DlidxIterRo
14e10 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
14e20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14e30 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
14e40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
14e50 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
14e60 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
14e70 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  x);..    assert(
14e80 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
14e90 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
14ea0 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
14eb0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
14ec0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
14ed0 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
14ee0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
14ef0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
14f00 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
14f10 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
14f20 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
14f30 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
14f40 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
14f50 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  }..  do{.    if(
14f60 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d   bMove && p->rc=
14f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74  =SQLITE_OK ) pIt
14f80 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74  er->xNext(p, pIt
14f90 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
14fa0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
14fb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
14fc0 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
14fd0 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
14fe0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
14ff0 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
15000 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
15010 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
15020 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77   bMove = 1;.  }w
15030 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
15040 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a  ITE_OK );.}.../*
15050 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65  .** Free the ite
15060 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
15070 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15080 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
15090 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
150a0 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73  ultiIterFree(Fts
150b0 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
150c0 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
150d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
150e0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
150f0 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
15100 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
15110 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  r(&pIter->aSeg[i
15120 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
15130 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
15140 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63  se(pIter->pStruc
15150 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  t);.    fts5Buff
15160 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70  erFree(&pIter->p
15170 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  oslist);.    sql
15180 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
15190 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
151a0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
151b0 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74  erAdvanced(.  Ft
151c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
151e0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
151f0 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
15200 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  */.  Fts5Iter *p
15210 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
15220 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
15230 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73   to update aFirs
15240 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f  t[] array for */
15250 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c  .  int iChanged,
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
15280 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74  ub-iterator just
15290 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69   advanced */.  i
152a0 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20  nt iMinset      
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152c0 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20  * Minimum entry 
152d0 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73  in aFirst[] to s
152e0 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  et */.){.  int i
152f0 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72  ;.  for(i=(pIter
15300 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
15310 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26  /2; i>=iMinset &
15320 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
15330 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20  OK; i=i/2){.    
15340 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28  int iEq;.    if(
15350 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
15360 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
15370 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20  Iter, i)) ){.   
15380 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
15390 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
153a0 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20  Seg[iEq];.      
153b0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
153c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
153d0 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
153e0 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20   pSeg, 0);.     
153f0 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67   i = pIter->nSeg
15400 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20   + iEq;.    }.  
15410 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69  }.}../*.** Sub-i
15420 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64  terator iChanged
15430 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74   of iterator pIt
15440 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  er has just been
15450 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74   advanced. It st
15460 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ill.** points to
15470 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74   the same term t
15480 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64  hough - just a d
15490 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20  ifferent rowid. 
154a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
154b0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64   attempts to upd
154c0 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
154d0 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
154e0 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e  First[] accordin
154f0 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  gly..** If it do
15500 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c  es so successful
15510 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ly, 0 is returne
15520 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a  d. Otherwise 1..
15530 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72  **.** If non-zer
15540 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  o is returned, t
15550 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
15560 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49   call fts5MultiI
15570 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a  terAdvanced().**
15580 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72   on the iterator
15590 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66   instead. That f
155a0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
155b0 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e   same as this on
155c0 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  e, except.** tha
155d0 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20  t it deals with 
155e0 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
155f0 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a   cases as well..
15600 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */ .static int f
15610 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15620 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
15630 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
15640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15650 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
15660 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
15670 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
15680 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
15690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
156a0 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
156b0 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
156c0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
156d0 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a 20  r **ppFirst.){. 
156e0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e   Fts5SegIter *pN
156f0 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  ew = &pIter->aSe
15700 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20  g[iChanged];..  
15710 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
15720 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
15730 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65  Rowid.   || (pNe
15740 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  w->iRowid<pIter-
15750 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
15760 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b  pIter->bRev.  ){
15770 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
15780 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74  Fts5SegIter *pOt
15790 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  her = &pIter->aS
157a0 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78  eg[iChanged ^ 0x
157b0 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72  0001];.    pIter
157c0 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d  ->iSwitchRowid =
157d0 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53   pIter->bRev ? S
157e0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
157f0 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
15800 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d     for(i=(pIter-
15810 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
15820 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  2; 1; i=i/2){.  
15830 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
15840 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
15850 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20  aFirst[i];..    
15860 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
15870 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61  pLeaf );.      a
15880 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
15890 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65  rmEq==0 || pOthe
158a0 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20  r->pLeaf );..   
158b0 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65     if( pRes->bTe
158c0 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20  rmEq ){.        
158d0 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
158e0 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  ==pOther->iRowid
158f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15900 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
15910 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
15920 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e  r->iRowid>pNew->
15930 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
15940 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15950 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15960 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
15970 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
15980 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b    pNew = pOther;
15990 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
159a0 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77  f( (pOther->iRow
159b0 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id>pIter->iSwitc
159c0 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
159d0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
159e0 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
159f0 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
15a00 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
15a10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15a20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28  pRes->iFirst = (
15a30 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65  u16)(pNew - pIte
15a40 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20  r->aSeg);.      
15a50 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b  if( i==1 ) break
15a60 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20  ;..      pOther 
15a70 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
15a80 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20  pIter->aFirst[i 
15a90 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74  ^ 0x0001].iFirst
15aa0 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   ];.    }.  }.. 
15ab0 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e 65 77   *ppFirst = pNew
15ac0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
15ad0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
15ae0 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61  Iter->bEof varia
15af0 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ble based on the
15b00 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75   state of the su
15b10 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  b-iterators..*/.
15b20 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15b30 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
15b40 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
15b50 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
15b60 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
15b70 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
15b80 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
15b90 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  .  pIter->base.b
15ba0 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61  Eof = pSeg->pLea
15bb0 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69  f==0;.  pIter->i
15bc0 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53  SwitchRowid = pS
15bd0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  eg->iRowid;.}../
15be0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
15bf0 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
15c00 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
15c10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
15c20 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
15c30 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
15c40 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69  s5Index.rc. It i
15c50 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  s not .** consid
15c60 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
15c70 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
15c80 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66  aches EOF, or if
15c90 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
15ca0 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74  t .** EOF when t
15cb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15cc0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
15cd0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15ce0 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
15cf0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
15d00 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  5Iter *pIter,.  
15d10 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20  int bFrom,      
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d  /* True if argum
15d40 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c  ent iFrom is val
15d50 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f  id */.  i64 iFro
15d60 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
15d70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
15d80 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66  ce at least as f
15d90 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b  ar as this */.){
15da0 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20  .  int bUseFrom 
15db0 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72  = bFrom;.  asser
15dc0 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  t( pIter->base.b
15dd0 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68 69 6c  Eof==0 );.  whil
15de0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
15df0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
15e00 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
15e10 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
15e20 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72  .    int bNewTer
15e30 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 53  m = 0;.    Fts5S
15e40 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15e50 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72  pIter->aSeg[iFir
15e60 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  st];.    assert(
15e70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15e80 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62 55 73  K );.    if( bUs
15e90 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70  eFrom && pSeg->p
15ea0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 66  Dlidx ){.      f
15eb0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72  ts5SegIterNextFr
15ec0 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f  om(p, pSeg, iFro
15ed0 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
15ee0 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74       pSeg->xNext
15ef0 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54  (p, pSeg, &bNewT
15f00 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  erm);.    }..   
15f10 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
15f20 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20  ==0 || bNewTerm 
15f30 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c  .     || fts5Mul
15f40 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
15f50 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73 74  id(pIter, iFirst
15f60 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29 7b 0a  , &pSeg).    ){.
15f70 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
15f80 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
15f90 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
15fa0 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
15fb0 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65  iIterSetEof(pIte
15fc0 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67 20 3d  r);.      pSeg =
15fd0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
15fe0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15ff0 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 66  First];.      if
16000 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
16010 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d   ) return;.    }
16020 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74  ..    fts5Assert
16030 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
16040 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
16050 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70 49 74  sert( pSeg==&pIt
16060 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
16070 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
16080 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66  ] && pSeg->pLeaf
16090 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65   );.    if( pIte
160a0 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d 3d 30  r->bSkipEmpty==0
160b0 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73 20 29   || pSeg->nPos )
160c0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
160d0 53 65 74 4f 75 74 70 75 74 73 28 70 49 74 65 72  SetOutputs(pIter
160e0 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 72  , pSeg);.      r
160f0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
16100 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20   bUseFrom = 0;. 
16110 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
16120 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
16130 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e 64 65  ext2(.  Fts5Inde
16140 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65  x *p, .  Fts5Ite
16150 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
16160 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
16170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16180 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69 67  UT: True if *mig
16190 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d 20  ht* be new term 
161a0 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
161b0 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74  pIter->bSkipEmpt
161c0 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  y );.  if( p->rc
161d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
161e0 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
161f0 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
16200 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49   int iFirst = pI
16210 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
16220 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74 73  First;.      Fts
16230 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
16240 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46   &pIter->aSeg[iF
16250 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e 74  irst];.      int
16260 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 0a   bNewTerm = 0;..
16270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
16280 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16290 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e  ;.      pSeg->xN
162a0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e  ext(p, pSeg, &bN
162b0 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69  ewTerm);.      i
162c0 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
162d0 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20  0 || bNewTerm . 
162e0 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c        || fts5Mul
162f0 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
16300 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73 74  id(pIter, iFirst
16310 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20 20 29  , &pSeg).      )
16320 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
16330 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
16340 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
16350 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  , 1);.        ft
16360 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
16370 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  f(pIter);.      
16380 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31    *pbNewTerm = 1
16390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
163a0 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
163b0 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65  terSetup(p, pIte
163c0 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65 28  r);..    }while(
163d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
163e0 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20  Empty(p, pIter) 
163f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
16400 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
16410 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46 74  tOutputs_Noop(Ft
16420 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 31  s5Iter *pUnused1
16430 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
16440 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  Unused2){.  UNUS
16450 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73 65  ED_PARAM2(pUnuse
16460 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a 7d  d1, pUnused2);.}
16470 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 74 65  ..static Fts5Ite
16480 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r *fts5MultiIter
16490 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e 64  Alloc(.  Fts5Ind
164a0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
164b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
164c0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
164d0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
164e0 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46 74  int nSeg.){.  Ft
164f0 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20  s5Iter *pNew;.  
16500 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20  /* Power of two 
16530 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f  >= nSeg */..  fo
16540 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74  r(nSlot=2; nSlot
16550 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c  <nSeg; nSlot=nSl
16560 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ot*2);.  pNew = 
16570 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
16580 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46   .      sizeof(F
16590 74 73 35 49 74 65 72 29 20 2b 20 20 20 20 20 20  ts5Iter) +      
165a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
165b0 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  New */.      siz
165c0 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
165d0 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20   * (nSlot-1) +  
165e0 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d   /* pNew->aSeg[]
165f0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
16600 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20  (Fts5CResult) * 
16610 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a  nSlot         /*
16620 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20   pNew->aFirst[] 
16630 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  */.  );.  if( pN
16640 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
16650 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20  nSeg = nSlot;.  
16660 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d    pNew->aFirst =
16670 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26   (Fts5CResult*)&
16680 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74  pNew->aSeg[nSlot
16690 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  ];.    pNew->pIn
166a0 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e 65  dex = p;.    pNe
166b0 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  w->xSetOutputs =
166c0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
166d0 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20  uts_Noop;.  }.  
166e0 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
166f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16700 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28  PoslistCallback(
16710 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55  .  Fts5Index *pU
16720 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a  nused, .  void *
16730 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
16740 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
16750 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 55  nt nChunk.){.  U
16760 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75  NUSED_PARAM(pUnu
16770 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e  sed);.  assert_n
16780 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a  c( nChunk>=0 );.
16790 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29    if( nChunk>0 )
167a0 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
167b0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28  SafeAppendBlob((
167c0 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e  Fts5Buffer*)pCon
167d0 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43  text, pChunk, nC
167e0 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79  hunk);.  }.}..ty
167f0 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73  pedef struct Pos
16800 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
16810 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
16820 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69  tx;.struct Posli
16830 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a  stCallbackCtx {.
16840 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
16850 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
16860 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74    /* Append to t
16870 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
16880 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
16890 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
168a0 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63  /* Restrict matc
168b0 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75  hes to this colu
168c0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61  mn */.  int eSta
168d0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
168e0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61          /* See a
168f0 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65  bove */.};..type
16900 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69  def struct Posli
16910 73 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73  stOffsetsCtx Pos
16920 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a  listOffsetsCtx;.
16930 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66  struct PoslistOf
16940 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73  fsetsCtx {.  Fts
16950 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16970 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62  Append to this b
16980 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  uffer */.  Fts5C
16990 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
169a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
169b0 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
169c0 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f  o this column */
169d0 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20  .  int iRead;.  
169e0 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a  int iWrite;.};..
169f0 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65  /*.** TODO: Make
16a00 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63   this more effic
16a10 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20  ient!.*/.static 
16a20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  int fts5IndexCol
16a30 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73  setTest(Fts5Cols
16a40 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74  et *pColset, int
16a50 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b   iCol){.  int i;
16a60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
16a70 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
16a80 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ){.    if( pCols
16a90 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43  et->aiCol[i]==iC
16aa0 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ol ) return 1;. 
16ab0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16ac0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16ad0 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  s5PoslistOffsets
16ae0 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
16af0 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20  Index *pUnused, 
16b00 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
16b10 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
16b20 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
16b30 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 4f  nk.){.  PoslistO
16b40 66 66 73 65 74 73 43 74 78 20 2a 70 43 74 78 20  ffsetsCtx *pCtx 
16b50 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  = (PoslistOffset
16b60 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  sCtx*)pContext;.
16b70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
16b80 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72  Unused);.  asser
16b90 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
16ba0 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
16bb0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  0 ){.    int i =
16bc0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
16bd0 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  <nChunk ){.     
16be0 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20   int iVal;.     
16bf0 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
16c00 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d  int32(&pChunk[i]
16c10 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , iVal);.      i
16c20 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65  Val += pCtx->iRe
16c30 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43  ad - 2;.      pC
16c40 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c  tx->iRead = iVal
16c50 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
16c60 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
16c70 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69  pCtx->pColset, i
16c80 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
16c90 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
16ca0 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d  pendVarint(pCtx-
16cb0 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20  >pBuf, iVal + 2 
16cc0 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b  - pCtx->iWrite);
16cd0 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69  .        pCtx->i
16ce0 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20  Write = iVal;.  
16cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16d00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16d10 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72  ts5PoslistFilter
16d20 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
16d30 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 0a  Index *pUnused,.
16d40 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
16d50 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
16d60 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
16d70 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61  k.){.  PoslistCa
16d80 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20  llbackCtx *pCtx 
16d90 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  = (PoslistCallba
16da0 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  ckCtx*)pContext;
16db0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
16dc0 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65  pUnused);.  asse
16dd0 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
16de0 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
16df0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61  >0 ){.    /* Sea
16e00 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20 66  rch through to f
16e10 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76 61  ind the first va
16e20 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65 20  rint with value 
16e30 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a 20  1. This is the. 
16e40 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
16e50 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20  he next columns 
16e60 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  hits. */.    int
16e70 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
16e80 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20  iStart = 0;..   
16e90 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74   if( pCtx->eStat
16ea0 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e  e==2 ){.      in
16eb0 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74  t iCol;.      ft
16ec0 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
16ed0 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f  2(pChunk, i, iCo
16ee0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  l);.      if( ft
16ef0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16f00 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16f10 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20   iCol) ){.      
16f20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
16f30 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35   1;.        fts5
16f40 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
16f50 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75  Varint(pCtx->pBu
16f60 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  f, 1);.      }el
16f70 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78  se{.        pCtx
16f80 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20  ->eState = 0;.  
16f90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
16fa0 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69 6c   do {.      whil
16fb0 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20 70  e( i<nChunk && p
16fc0 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20 29  Chunk[i]!=0x01 )
16fd0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
16fe0 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78 38   pChunk[i] & 0x8
16ff0 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  0 ) i++;.       
17000 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
17010 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
17020 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
17030 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
17040 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70  pendBlob(pCtx->p
17050 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74  Buf, &pChunk[iSt
17060 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b  art], i-iStart);
17070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17080 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20  f( i<nChunk ){. 
17090 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b         int iCol;
170a0 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
170b0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  = i;.        i++
170c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  ;.        if( i>
170d0 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =nChunk ){.     
170e0 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74       pCtx->eStat
170f0 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  e = 2;.        }
17100 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17110 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
17120 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69  t32(pChunk, i, i
17130 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Col);.          
17140 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 66  pCtx->eState = f
17150 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
17160 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
17170 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , iCol);.       
17180 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
17190 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ate ){.         
171a0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
171b0 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78  eAppendBlob(pCtx
171c0 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b  ->pBuf, &pChunk[
171d0 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72  iStart], i-iStar
171e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
171f0 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20  iStart = i;.    
17200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17210 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
17220 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29  hile( i<nChunk )
17230 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
17240 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74  void fts5ChunkIt
17250 65 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64  erate(.  Fts5Ind
17260 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
17270 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17280 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
17290 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
172b0 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73   Poslist of this
172c0 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76   iterator */.  v
172d0 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172f0 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  * Context pointe
17300 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c  r for xChunk cal
17310 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20  lback */.  void 
17320 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e  (*xChunk)(Fts5In
17330 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e  dex*, void*, con
17340 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a  st u8*, int).){.
17350 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65    int nRem = pSe
17360 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  g->nPos;        
17370 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
17380 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f  ytes still to co
17390 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  me */.  Fts5Data
173a0 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75   *pData = 0;.  u
173b0 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65  8 *pChunk = &pSe
173c0 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67  g->pLeaf->p[pSeg
173d0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
173e0 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d    int nChunk = M
173f0 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70  IN(nRem, pSeg->p
17400 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70  Leaf->szLeaf - p
17410 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
17420 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  );.  int pgno = 
17430 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  pSeg->iLeafPgno;
17440 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20  .  int pgnoSave 
17450 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
17460 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
17470 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74 61  tmwork with deta
17480 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73 65  il=none database
17490 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
174a0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
174b0 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
174c0 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20  _NONE );..  if( 
174d0 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46  (pSeg->flags & F
174e0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
174f0 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  RSE)==0 ){.    p
17500 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31  gnoSave = pgno+1
17510 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
17520 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28  1 ){.    xChunk(
17530 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c  p, pCtx, pChunk,
17540 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52   nChunk);.    nR
17550 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20  em -= nChunk;.  
17560 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
17570 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66  e(pData);.    if
17580 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20  ( nRem<=0 ){.   
17590 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
175a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b  lse{.      pgno+
175b0 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  +;.      pData =
175c0 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c   fts5LeafRead(p,
175d0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
175e0 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e  WID(pSeg->pSeg->
175f0 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a  iSegid, pgno));.
17600 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d        if( pData=
17610 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
17620 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74    pChunk = &pDat
17630 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e  a->p[4];.      n
17640 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
17650 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  , pData->szLeaf 
17660 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  - 4);.      if( 
17670 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29  pgno==pgnoSave )
17680 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17690 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61  ( pSeg->pNextLea
176a0 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
176b0 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20  pSeg->pNextLeaf 
176c0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20  = pData;.       
176d0 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   pData = 0;.    
176e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
176f0 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
17700 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
17710 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
17720 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46  d entry (not EOF
17730 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
17740 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20  ion appends the 
17750 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
17760 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
17770 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62  nt entry to.** b
17780 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64  uffer pBuf. It d
17790 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63  oes not make a c
177a0 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
177b0 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a  ion-list size.**
177c0 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   field..*/.stati
177d0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74  c void fts5Segit
177e0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
177f0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
17800 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a  5SegIter *pSeg,.
17810 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
17820 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66  olset,.  Fts5Buf
17830 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69  fer *pBuf.){.  i
17840 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72  f( 0==fts5Buffer
17850 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75  Grow(&p->rc, pBu
17860 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29  f, pSeg->nPos) )
17870 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
17880 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  t==0 ){.      ft
17890 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
178a0 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70  , pSeg, (void*)p
178b0 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Buf, fts5Poslist
178c0 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
178d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
178e0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
178f0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
17900 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  _FULL ){.       
17910 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
17920 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20  Ctx sCtx;.      
17930 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42    sCtx.pBuf = pB
17940 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  uf;.        sCtx
17950 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73  .pColset = pCols
17960 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  et;.        sCtx
17970 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e  .eState = fts5In
17980 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
17990 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  olset, 0);.     
179a0 20 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e     assert( sCtx.
179b0 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74  eState==0 || sCt
179c0 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20  x.eState==1 );. 
179d0 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b         fts5Chunk
179e0 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c  Iterate(p, pSeg,
179f0 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66   (void*)&sCtx, f
17a00 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72  ts5PoslistFilter
17a10 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
17a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17a30 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
17a40 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20  x sCtx;.        
17a50 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c  memset(&sCtx, 0,
17a60 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a   sizeof(sCtx));.
17a70 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75          sCtx.pBu
17a80 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20  f = pBuf;.      
17a90 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d    sCtx.pColset =
17aa0 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20   pColset;.      
17ab0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
17ac0 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69  te(p, pSeg, (voi
17ad0 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f  d*)&sCtx, fts5Po
17ae0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c  slistOffsetsCall
17af0 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  back);.      }. 
17b00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
17b10 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74  * IN/OUT paramet
17b20 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20  er (*pa) points 
17b30 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69  to a position li
17b40 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69  st n bytes in si
17b50 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f  ze. If.** the po
17b60 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
17b70 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
17b80 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68   column iCol, th
17b90 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a  en (*pa) is set.
17ba0 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ** to point to t
17bb0 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d  he sub-position-
17bc0 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f  list for that co
17bd0 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d  lumn and the num
17be0 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20  ber of.** bytes 
17bf0 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20  in it returned. 
17c00 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d  Or, if the argum
17c10 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ent position lis
17c20 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f  t does not.** co
17c30 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65  ntain any entrie
17c40 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  s for column iCo
17c50 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  l, return 0..*/.
17c60 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
17c70 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a  ndexExtractCol(.
17c80 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c    const u8 **pa,
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69    /* IN/OUT: Poi
17cb0 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20  nter to poslist 
17cc0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ce0 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65       /* IN: Size
17cf0 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62   of poslist in b
17d00 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ytes */.  int iC
17d10 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
17d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
17d30 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66  umn to extract f
17d40 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29  rom poslist */.)
17d50 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  {.  int iCurrent
17d60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
17d70 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20      /* Anything 
17d80 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
17d90 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a   0x01 is col 0 *
17da0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20  /.  const u8 *p 
17db0 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75  = *pa;.  const u
17dc0 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b  8 *pEnd = &p[n];
17dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
17de0 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
17df0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
17e00 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c  /..  while( iCol
17e10 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20  >iCurrent ){.   
17e20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
17e30 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70  ter p until it p
17e40 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
17e50 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68   an 0x01 byte th
17e60 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  at is.    ** not
17e70 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e   part of a varin
17e80 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  t. Note that it 
17e90 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
17ea0 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a 20  for a negative. 
17eb0 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65     ** or extreme
17ec0 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74 20  ly large varint 
17ed0 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20  to occur within 
17ee0 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20 70  an uncorrupted p
17ef0 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  osition .    ** 
17f00 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61 73  list. So the las
17f10 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 76  t byte of each v
17f20 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73 73  arint may be ass
17f30 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20 63  umed to have a c
17f40 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38 30  lear.    ** 0x80
17f50 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68   bit.  */.    wh
17f60 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29 7b  ile( *p!=0x01 ){
17f70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70  .      while( *p
17f80 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 20  ++ & 0x80 );.   
17f90 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29     if( p>=pEnd )
17fa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
17fb0 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a  .    *pa = p++;.
17fc0 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 2a      iCurrent = *
17fd0 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 75  p++;.    if( iCu
17fe0 72 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b 0a  rrent & 0x80 ){.
17ff0 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20        p--;.     
18000 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   p += fts5GetVar
18010 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e  int32(p, iCurren
18020 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
18030 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65  if( iCol!=iCurre
18040 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  nt ) return 0;..
18050 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69    /* Advance poi
18060 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20  nter p until it 
18070 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f  points to pEnd o
18080 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74  r an 0x01 byte t
18090 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  hat is.  ** not 
180a0 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
180b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c 70   */.  while( p<p
180c0 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31 20  End && *p!=0x01 
180d0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  ){.    while( *p
180e0 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 7d  ++ & 0x80 );.  }
180f0 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28  ..  return p - (
18100 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  *pa);.}..static 
18110 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 45 78  void fts5IndexEx
18120 74 72 61 63 74 43 6f 6c 73 65 74 28 0a 20 20 69  tractColset(.  i
18130 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35 43  nt *pRc,.  Fts5C
18140 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
18150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18160 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f  lset to filter o
18170 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
18180 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c  *pPos, int nPos,
18190 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
181a0 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73  on list */.  Fts
181b0 35 42 75 66 66 65 72 20 2a 70 42 75 66 20 20 20  5Buffer *pBuf   
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181d0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
181e0 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
181f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18200 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 74 73 35   int i;.    fts5
18210 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29  BufferZero(pBuf)
18220 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
18230 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20  <pColset->nCol; 
18240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
18250 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70 50 6f  t u8 *pSub = pPo
18260 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 75  s;.      int nSu
18270 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  b = fts5IndexExt
18280 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e  ractCol(&pSub, n
18290 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69  Pos, pColset->ai
182a0 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  Col[i]);.      i
182b0 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  f( nSub ){.     
182c0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
182d0 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75  endBlob(pRc, pBu
182e0 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a  f, nSub, pSub);.
182f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18300 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  }.}../*.** xSetO
18310 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
18320 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e  used by detail=n
18330 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  one tables..*/.s
18340 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18350 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
18360 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  ne(Fts5Iter *pIt
18370 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18380 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65 72 74  *pSeg){.  assert
18390 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
183a0 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
183b0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
183c0 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ONE );.  pIter->
183d0 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
183e0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49  eg->iRowid;.  pI
183f0 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
18400 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d 0a  = pSeg->nPos;.}.
18410 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
18420 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
18430 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20   by detail=full 
18440 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c 20 74  and detail=col t
18450 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a 2a 2a  ables when no.**
18460 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 73 20   column filters 
18470 61 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  are specified..*
18480 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18490 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
184a0 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35 49 74  _Nocolset(Fts5It
184b0 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
184c0 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
184d0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
184e0 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
184f0 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  id;.  pIter->bas
18500 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e  e.nData = pSeg->
18510 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  nPos;..  assert(
18520 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
18530 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
18540 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
18550 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
18560 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d  pIter->pColset==
18570 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  0 );..  if( pSeg
18580 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
18590 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e  eg->nPos<=pSeg->
185a0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
185b0 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61  .    /* All data
185c0 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   is stored on th
185d0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
185e0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74  Populate the out
185f0 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69  put .    ** vari
18600 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69  ables to point i
18610 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
18620 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e  the page object.
18630 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 62   */.    pIter->b
18640 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70 53 65  ase.pData = &pSe
18650 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67  g->pLeaf->p[pSeg
18660 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
18670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18680 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74  The data is dist
18690 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f  ributed over two
186a0 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20   or more pages. 
186b0 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65  Copy it into the
186c0 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72  .    ** Fts5Iter
186d0 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20  .poslist buffer 
186e0 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65  and then set the
186f0 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20   output pointer 
18700 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  to point.    ** 
18710 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20  to this buffer. 
18720 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66   */.    fts5Buff
18730 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
18740 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73  oslist);.    fts
18750 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
18760 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
18770 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e  Seg, 0, &pIter->
18780 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49  poslist);.    pI
18790 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20  ter->base.pData 
187a0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
187b0 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  .p;.  }.}../*.**
187c0 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
187d0 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 20  lback used when 
187e0 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74 20 6f  the Fts5Colset o
187f0 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c 3d 3d  bject has nCol==
18800 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67 61 69  0 (match.** agai
18810 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 61  nst no columns a
18820 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  t all)..*/.stati
18830 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
18840 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f  etOutputs_ZeroCo
18850 6c 73 65 74 28 46 74 73 35 49 74 65 72 20 2a 70  lset(Fts5Iter *p
18860 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18870 72 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e 55 53  r *pSeg){.  UNUS
18880 45 44 5f 50 41 52 41 4d 28 70 53 65 67 29 3b 0a  ED_PARAM(pSeg);.
18890 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
188a0 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ata = 0;.}../*.*
188b0 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
188c0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64  llback used by d
188d0 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e 20 74  etail=col when t
188e0 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
188f0 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64 20 74   filter.** and t
18900 68 65 72 65 20 61 72 65 20 31 30 30 20 6f 72 20  here are 100 or 
18910 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c  more columns. Al
18920 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61 20 66  so called as a f
18930 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20  allback from.** 
18940 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18950 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74 68 65  ts_Col100 if the
18960 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73 70 61   column-list spa
18970 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
18980 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
18990 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
189a0 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46 74 73  tOutputs_Col(Fts
189b0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
189c0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
189d0 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  {.  fts5BufferZe
189e0 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
189f0 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67 69 74  st);.  fts5Segit
18a00 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
18a10 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70  >pIndex, pSeg, p
18a20 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 26  Iter->pColset, &
18a30 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18a40 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
18a50 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18a60 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18a70 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18a80 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18a90 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18aa0 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18ab0 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  st.n;.}../*.** x
18ac0 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18ad0 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a 20 0a  ack used when: .
18ae0 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61 69 6c  **.**   * detail
18af0 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  =col,.**   * the
18b00 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66  re is a column f
18b10 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20  ilter, and.**   
18b20 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * the table cont
18b30 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65 77 65  ains 100 or fewe
18b40 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a  r columns. .**.*
18b50 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e 74  * The last point
18b60 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20 61 6c   is to ensure al
18b70 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  l column numbers
18b80 20 61 72 65 20 73 74 6f 72 65 64 20 61 73 20 0a   are stored as .
18b90 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 76  ** single-byte v
18ba0 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  arints..*/.stati
18bb0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
18bc0 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
18bd0 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
18be0 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
18bf0 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  Seg){..  assert(
18c00 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
18c10 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
18c20 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f  ==FTS5_DETAIL_CO
18c30 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73 65 72  LUMNS );.  asser
18c40 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  t( pIter->pColse
18c50 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  t );..  if( pSeg
18c60 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
18c70 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e 70  eg->nPos>pSeg->p
18c80 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
18c90 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f      fts5IterSetO
18ca0 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74 65 72  utputs_Col(pIter
18cb0 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c 73 65  , pSeg);.  }else
18cc0 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 28 75  {.    u8 *a = (u
18cd0 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d  8*)&pSeg->pLeaf-
18ce0 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
18cf0 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20 2a 70  fset];.    u8 *p
18d00 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b 70 53  End = (u8*)&a[pS
18d10 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20 20  eg->nPos]; .    
18d20 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b 0a 20  int iPrev = 0;. 
18d30 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20     int *aiCol = 
18d40 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e  pIter->pColset->
18d50 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 2a  aiCol;.    int *
18d60 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69 43 6f  aiColEnd = &aiCo
18d70 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  l[pIter->pColset
18d80 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38  ->nCol];..    u8
18d90 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72 2d 3e   *aOut = pIter->
18da0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 69  poslist.p;.    i
18db0 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20 30 3b  nt iPrevOut = 0;
18dc0 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ..    pIter->bas
18dd0 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
18de0 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 77 68  >iRowid;..    wh
18df0 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20  ile( a<pEnd ){. 
18e00 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20 28 69       iPrev += (i
18e10 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20  nt)a++[0] - 2;. 
18e20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61 69 43       while( *aiC
18e30 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20 20 20  ol<iPrev ){.    
18e40 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20      aiCol++;.   
18e50 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c 3d 3d       if( aiCol==
18e60 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74 6f 20  aiColEnd ) goto 
18e70 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f  setoutputs_col_o
18e80 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
18e90 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d 69 50    if( *aiCol==iP
18ea0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  rev ){.        *
18eb0 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 28 69  aOut++ = (u8)((i
18ec0 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75 74 29  Prev - iPrevOut)
18ed0 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69   + 2);.        i
18ee0 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65 76 3b  PrevOut = iPrev;
18ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18f00 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f  setoutputs_col_o
18f10 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  ut:.    pIter->b
18f20 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18f30 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18f40 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18f50 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70 49 74  ata = aOut - pIt
18f60 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
18f70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74   }.}../*.** xSet
18f80 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18f90 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
18fa0 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72 65 20  full when there 
18fb0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  is a column filt
18fc0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
18fd0 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18fe0 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73 35 49  tputs_Full(Fts5I
18ff0 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
19000 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
19010 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
19020 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 70  olset = pIter->p
19030 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65 72 2d  Colset;.  pIter-
19040 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
19050 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  Seg->iRowid;..  
19060 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
19070 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
19080 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
19090 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20 61  TAIL_FULL );.  a
190a0 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74 20 29  ssert( pColset )
190b0 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69  ;..  if( pSeg->i
190c0 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
190d0 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65  >nPos<=pSeg->pLe
190e0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
190f0 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69 73    /* All data is
19100 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
19110 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f 70  urrent page. Pop
19120 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74  ulate the output
19130 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c   .    ** variabl
19140 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f  es to point into
19150 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
19160 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f   page object. */
19170 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  .    const u8 *a
19180 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
19190 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
191a0 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70  fset];.    if( p
191b0 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20  Colset->nCol==1 
191c0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
191d0 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66 74 73  base.nData = fts
191e0 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
191f0 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  (&a, pSeg->nPos,
19200 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30  pColset->aiCol[0
19210 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  ]);.      pIter-
19220 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 61 3b  >base.pData = a;
19230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19240 20 20 69 6e 74 20 2a 70 52 63 20 3d 20 26 70 49    int *pRc = &pI
19250 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3b  ter->pIndex->rc;
19260 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
19270 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
19280 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  slist);.      ft
19290 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
192a0 6c 73 65 74 28 70 52 63 2c 20 70 43 6f 6c 73 65  lset(pRc, pColse
192b0 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  t, a, pSeg->nPos
192c0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
192d0 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  t);.      pIter-
192e0 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
192f0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
19300 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73        pIter->bas
19310 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.nData = pIter-
19320 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20  >poslist.n;.    
19330 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
19340 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69  * The data is di
19350 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74  stributed over t
19360 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  wo or more pages
19370 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74  . Copy it into t
19380 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74  he.    ** Fts5It
19390 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  er.poslist buffe
193a0 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74  r and then set t
193b0 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65  he output pointe
193c0 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a  r to point.    *
193d0 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  * to this buffer
193e0 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  .  */.    fts5Bu
193f0 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
19400 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
19410 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
19420 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
19430 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20   pSeg, pColset, 
19440 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
19450 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
19460 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
19470 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
19480 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
19490 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
194a0 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  st.n;.  }.}..sta
194b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
194c0 72 53 65 74 4f 75 74 70 75 74 43 62 28 69 6e 74  rSetOutputCb(int
194d0 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65 72 20   *pRc, Fts5Iter 
194e0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 2a  *pIter){.  if( *
194f0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
19500 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
19510 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49 74 65   *pConfig = pIte
19520 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
19530 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ig;.    if( pCon
19540 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
19550 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
19560 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
19570 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
19580 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19590 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  None;.    }..   
195a0 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d   else if( pIter-
195b0 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20  >pColset==0 ){. 
195c0 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
195d0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
195e0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63  erSetOutputs_Noc
195f0 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  olset;.    }..  
19600 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72    else if( pIter
19610 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d  ->pColset->nCol=
19620 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =0 ){.      pIte
19630 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19640 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19650 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b 0a  uts_ZeroColset;.
19660 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20      }..    else 
19670 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  if( pConfig->eDe
19680 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
19690 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  L_FULL ){.      
196a0 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
196b0 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
196c0 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20  Outputs_Full;.  
196d0 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20    }..    else{. 
196e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
196f0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
19700 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d  TS5_DETAIL_COLUM
19710 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NS );.      if( 
19720 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31  pConfig->nCol<=1
19730 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  00 ){.        pI
19740 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19750 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19760 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20  tputs_Col100;.  
19770 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
19780 35 42 75 66 66 65 72 53 69 7a 65 28 70 52 63 2c  5BufferSize(pRc,
19790 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
197a0 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29  , pConfig->nCol)
197b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
197c0 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53         pIter->xS
197d0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
197e0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43  IterSetOutputs_C
197f0 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
19800 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
19810 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46  Allocate a new F
19820 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a  ts5Iter object..
19830 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62  **.** The new ob
19840 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65  ject will be use
19850 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
19860 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74 72  ough data in str
19870 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
19880 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20  ** If iLevel is 
19890 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61  -ve, then all da
198a0 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e  ta in all segmen
198b0 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72  ts is merged. Or
198c0 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  , if iLevel.** i
198d0 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65  s zero or greate
198e0 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  r, data from the
198f0 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20   first nSegment 
19900 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
19910 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d  l iLevel.** is m
19920 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erged..**.** The
19930 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61   iterator initia
19940 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  lly points to th
19950 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77  e first term/row
19960 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  id entry in the 
19970 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61 74  .** iterated dat
19980 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
19990 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
199a0 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ew(.  Fts5Index 
199b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
199c0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
199d0 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
199e0 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
199f0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
19a00 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  uct,         /* 
19a10 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70 65  Structure of spe
19a20 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  cific index */. 
19a30 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a50 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55   /* FTS5INDEX_QU
19a60 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  ERY_XXX flags */
19a70 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
19a80 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
19a90 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20     /* Colset to 
19aa0 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55  filter on (or NU
19ab0 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  LL) */.  const u
19ac0 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
19ad0 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
19ae0 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20   to seek to (or 
19af0 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74  NULL/0) */.  int
19b00 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65  Level to iterate
19b30 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f   (-1 for all) */
19b40 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c  .  int nSegment,
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19b70 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
19b80 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f  e (iLevel>=0) */
19b90 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70  .  Fts5Iter **pp
19ba0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
19bb0 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
19bc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65   */.){.  int nSe
19bd0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
19be0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19bf0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74  er of segment-it
19c00 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  ers in use */.  
19c10 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20  int iIter = 0;  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  /* */.  int iSeg
19c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19c50 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
19c60 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
19c70 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
19c80 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
19c90 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73  vel *pLvl;.  Fts
19ca0 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  5Iter *pNew;..  
19cb0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d  assert( (pTerm==
19cc0 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c  0 && nTerm==0) |
19cd0 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20  | iLevel<0 );.. 
19ce0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
19cf0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d  ce for the new m
19d00 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f  ulti-seg-iterato
19d10 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  r. */.  if( p->r
19d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19d30 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
19d40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19d50 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
19d60 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
19d70 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
19d80 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
19d90 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
19da0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
19db0 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48    nSeg += (p->pH
19dc0 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ash ? 1 : 0);.  
19dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
19de0 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63  Seg = MIN(pStruc
19df0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
19e00 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74  ].nSeg, nSegment
19e10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
19e20 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66  ppOut = pNew = f
19e30 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
19e40 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66  c(p, nSeg);.  if
19e50 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
19e60 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76  rn;.  pNew->bRev
19e70 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20   = (0!=(flags & 
19e80 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
19e90 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  DESC));.  pNew->
19ea0 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28 30 21  bSkipEmpty = (0!
19eb0 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
19ec0 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d  DEX_QUERY_SKIPEM
19ed0 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  PTY));.  pNew->p
19ee0 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
19ef0 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65  ;.  pNew->pColse
19f00 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 66  t = pColset;.  f
19f10 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
19f20 70 53 74 72 75 63 74 29 3b 0a 20 20 69 66 28 20  pStruct);.  if( 
19f30 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
19f40 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
19f50 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  T)==0 ){.    fts
19f60 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62  5IterSetOutputCb
19f70 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a  (&p->rc, pNew);.
19f80 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
19f90 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65  lize each of the
19fa0 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65   component segme
19fb0 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f  nt iterators. */
19fc0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
19fe0 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20  f( iLevel<0 ){. 
19ff0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
1a000 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
1a010 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1a020 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
1a030 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
1a040 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20  pHash ){.       
1a050 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e   /* Add a segmen
1a060 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74  t iterator for t
1a070 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1a080 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20  nts of the hash 
1a090 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
1a0a0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1a0b0 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
1a0c0 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
1a0d0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1a0e0 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72  HashInit(p, pTer
1a0f0 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
1a100 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
1a110 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d  .      for(pLvl=
1a120 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1a130 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
1a140 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pLvl++){.       
1a150 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e   for(iSeg=pLvl->
1a160 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
1a170 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
1a180 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1a190 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
1a1a0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
1a1b0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74  g];.          Ft
1a1c0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
1a1d0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
1a1e0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
1a1f0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
1a200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1a210 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
1a220 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
1a230 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1a240 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1a250 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
1a260 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  (p, pTerm, nTerm
1a270 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70  , flags, pSeg, p
1a280 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
1a290 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1a2a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1a2b0 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53        pLvl = &pS
1a2c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1a2d0 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72  evel];.      for
1a2e0 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53  (iSeg=nSeg-1; iS
1a2f0 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a  eg>=0; iSeg--){.
1a300 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
1a310 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c  terInit(p, &pLvl
1a320 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70  ->aSeg[iSeg], &p
1a330 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
1a340 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +]);.      }.   
1a350 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
1a360 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20  Iter==nSeg );.  
1a370 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
1a380 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73  bove was success
1a390 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  ful, each compon
1a3a0 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f  ent iterators no
1a3b0 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74  w points .  ** t
1a3c0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1a3d0 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74  y in its segment
1a3e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
1a3f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20  nitialize the . 
1a400 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72   ** aFirst[] arr
1a410 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ay. Or, if an er
1a420 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
1a430 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61  , free the itera
1a440 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  tor.  ** object 
1a450 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70  and set the outp
1a460 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
1a470 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
1a480 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a490 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72  ){.    for(iIter
1a4a0 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pNew->nSeg-1; i
1a4b0 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29  Iter>0; iIter--)
1a4c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b  {.      int iEq;
1a4d0 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20  .      if( (iEq 
1a4e0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
1a4f0 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69  oCompare(pNew, i
1a500 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20  Iter)) ){.      
1a510 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1a520 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  Seg = &pNew->aSe
1a530 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20  g[iEq];.        
1a540 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a550 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65  E_OK ) pSeg->xNe
1a560 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
1a570 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
1a580 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
1a590 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65   pNew, iEq, iIte
1a5a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1a5b0 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
1a5c0 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b  terSetEof(pNew);
1a5d0 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
1a5e0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
1a5f0 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
1a600 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
1a610 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74  y && fts5MultiIt
1a620 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65  erIsEmpty(p, pNe
1a630 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  w) ){.      fts5
1a640 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1a650 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20   pNew, 0, 0);.  
1a660 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77    }else if( pNew
1a670 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29  ->base.bEof==0 )
1a680 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
1a690 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65  ter *pSeg = &pNe
1a6a0 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46  w->aSeg[pNew->aF
1a6b0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
1a6c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65  .      pNew->xSe
1a6d0 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70  tOutputs(pNew, p
1a6e0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  Seg);.    }..  }
1a6f0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75  else{.    fts5Mu
1a700 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e 65 77  ltiIterFree(pNew
1a710 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  );.    *ppOut = 
1a720 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1a730 43 72 65 61 74 65 20 61 6e 20 46 74 73 35 49 74  Create an Fts5It
1a740 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65 73  er that iterates
1a750 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63   through the doc
1a760 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a  list provided.**
1a770 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1a780 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1a790 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1a7a0 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73  iIterNew2(.  Fts
1a7b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a7d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
1a7e0 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
1a7f0 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
1a800 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
1a810 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
1a820 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1a830 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  h */.  int bDesc
1a840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a850 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1a860 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  or descending ro
1a870 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46  wid order */.  F
1a880 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  ts5Iter **ppOut 
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a8a0 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
1a8b0 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
1a8c0 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74  New;.  pNew = ft
1a8d0 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
1a8e0 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e  (p, 2);.  if( pN
1a8f0 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  ew ){.    Fts5Se
1a900 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  gIter *pIter = &
1a910 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a  pNew->aSeg[1];..
1a920 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
1a930 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   = FTS5_SEGITER_
1a940 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28  ONETERM;.    if(
1a950 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30   pData->szLeaf>0
1a960 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
1a970 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a  >pLeaf = pData;.
1a980 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
1a990 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
1a9a0 65 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e  etVarint(pData->
1a9b0 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
1a9c0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
1a9d0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
1a9e0 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e  list = pData->nn
1a9f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46  ;.      pNew->aF
1aa00 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d  irst[1].iFirst =
1aa10 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44   1;.      if( bD
1aa20 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  esc ){.        p
1aa30 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20  New->bRev = 1;. 
1aa40 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c         pIter->fl
1aa50 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
1aa60 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
1aa70 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1aa80 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
1aa90 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
1aaa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aab0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
1aac0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
1aad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61       }.      pDa
1aae0 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ta = 0;.    }els
1aaf0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  e{.      pNew->b
1ab00 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  ase.bEof = 1;.  
1ab10 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49    }.    fts5SegI
1ab20 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49  terSetNext(p, pI
1ab30 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75  ter);..    *ppOu
1ab40 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
1ab50 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1ab60 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pData);.}../*.*
1ab70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ab80 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
1ab90 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e   at EOF or if an
1aba0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1abb0 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f  red. .** False o
1abc0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1abd0 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
1abe0 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  iIterEof(Fts5Ind
1abf0 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20  ex *p, Fts5Iter 
1ac00 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
1ac10 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20  t( p->rc .      
1ac20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b  || (pIter->aSeg[
1ac30 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1ac40 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
1ac50 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73  ==0)==pIter->bas
1ac60 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72  e.bEof .  );.  r
1ac70 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
1ac80 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66  pIter->base.bEof
1ac90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1aca0 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
1acb0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1acc0 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1acd0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
1ace0 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
1acf0 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
1ad00 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
1ad10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1ad20 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
1ad30 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
1ad40 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
1ad50 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
1ad60 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1ad70 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
1ad80 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1ad90 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1ada0 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75  .pLeaf );.  retu
1adb0 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  rn pIter->aSeg[ 
1adc0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1add0 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64  .iFirst ].iRowid
1ade0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1adf0 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
1ae00 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61  the next entry a
1ae10 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  t or following i
1ae20 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Match..*/.static
1ae30 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
1ae40 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
1ae50 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1ae60 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
1ae70 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
1ae80 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
1ae90 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
1aea0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1aeb0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
1aec0 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
1aed0 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
1aee0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
1aef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
1af00 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
1af10 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
1af20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
1af30 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
1af40 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
1af50 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
1af60 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
1af70 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
1af80 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
1af90 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1afa0 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
1afb0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
1afc0 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
1afd0 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
1afe0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
1aff0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
1b000 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
1b010 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
1b020 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
1b030 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  5Iter *pIter, in
1b040 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65  t *pn){.  Fts5Se
1b050 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65  gIter *p = &pIte
1b060 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1b070 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1b080 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74   ];.  *pn = p->t
1b090 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20  erm.n;.  return 
1b0a0 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a  p->term.p;.}../*
1b0b0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
1b0c0 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f  ew segment-id fo
1b0d0 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
1b0e0 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77  pStruct. The new
1b0f0 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d   segment.** id m
1b100 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
1b110 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75   and 65335 inclu
1b120 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e  sive, and must n
1b130 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a  ot be used by .*
1b140 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  * any currently 
1b150 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
1b160 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d  . If a free segm
1b170 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65  ent id cannot be
1b180 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
1b190 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  E_FULL is return
1b1a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1b1b0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
1b1c0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1b1d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1b1e0 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72  o-op. 0 is .** r
1b1f0 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
1b200 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1b210 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  int fts5Allocate
1b220 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20  Segid(Fts5Index 
1b230 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
1b240 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
1b250 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a  nt iSegid = 0;..
1b260 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1b280 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
1b290 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45  ent>=FTS5_MAX_SE
1b2a0 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70  GMENT ){.      p
1b2b0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55  ->rc = SQLITE_FU
1b2c0 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1b2d0 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41 58       /* FTS5_MAX
1b2e0 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75 72 72  _SEGMENT is curr
1b2f0 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 61 73  ently defined as
1b300 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20 66 6f   2000. So the fo
1b310 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
1b320 20 61 72 72 61 79 20 69 73 20 36 33 20 65 6c 65   array is 63 ele
1b330 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20 62 79  ments, or 252 by
1b340 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20 2a  tes, in size.  *
1b350 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55 73 65  /.      u32 aUse
1b360 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  d[(FTS5_MAX_SEGM
1b370 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a 20  ENT+31) / 32];. 
1b380 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
1b390 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
1b3a0 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b  ;.      u32 mask
1b3b0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  ;.      memset(a
1b3c0 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Used, 0, sizeof(
1b3d0 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20 20 66  aUsed));.      f
1b3e0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1b3f0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1b400 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1b410 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1b420 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1b430 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1b440 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1b450 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 74 72    int iId = pStr
1b460 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b470 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ].aSeg[iSeg].iSe
1b480 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gid;.          i
1b490 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41 58  f( iId<=FTS5_MAX
1b4a0 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
1b4b0 20 20 20 20 20 20 20 20 61 55 73 65 64 5b 28 69          aUsed[(i
1b4c0 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20 28  Id-1) / 32] |= (
1b4d0 75 33 32 29 31 20 3c 3c 20 28 28 69 49 64 2d 31  u32)1 << ((iId-1
1b4e0 29 20 25 20 33 32 29 3b 0a 20 20 20 20 20 20 20  ) % 32);.       
1b4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1b500 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
1b510 72 28 69 3d 30 3b 20 61 55 73 65 64 5b 69 5d 3d  r(i=0; aUsed[i]=
1b520 3d 30 78 46 46 46 46 46 46 46 46 3b 20 69 2b 2b  =0xFFFFFFFF; i++
1b530 29 3b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20  );.      mask = 
1b540 61 55 73 65 64 5b 69 5d 3b 0a 20 20 20 20 20 20  aUsed[i];.      
1b550 66 6f 72 28 69 53 65 67 69 64 3d 30 3b 20 6d 61  for(iSegid=0; ma
1b560 73 6b 20 26 20 28 28 75 33 32 29 31 20 3c 3c 20  sk & ((u32)1 << 
1b570 69 53 65 67 69 64 29 3b 20 69 53 65 67 69 64 2b  iSegid); iSegid+
1b580 2b 29 3b 0a 20 20 20 20 20 20 69 53 65 67 69 64  +);.      iSegid
1b590 20 2b 3d 20 31 20 2b 20 69 2a 33 32 3b 0a 0a 23   += 1 + i*32;..#
1b5a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b5b0 55 47 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  UG.      for(iLv
1b5c0 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
1b5d0 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
1b5e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
1b5f0 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
1b600 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b610 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
1b620 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1b630 72 74 5f 6e 63 28 20 69 53 65 67 69 64 21 3d 70  rt_nc( iSegid!=p
1b640 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b650 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
1b660 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20  iSegid );.      
1b670 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b680 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 53 65    assert_nc( iSe
1b690 67 69 64 3e 30 20 26 26 20 69 53 65 67 69 64 3c  gid>0 && iSegid<
1b6a0 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  =FTS5_MAX_SEGMEN
1b6b0 54 20 29 3b 0a 0a 20 20 20 20 20 20 7b 0a 20 20  T );..      {.  
1b6c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
1b6d0 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d  mt *pIdxSelect =
1b6e0 20 66 74 73 35 49 64 78 53 65 6c 65 63 74 53 74   fts5IdxSelectSt
1b6f0 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  mt(p);.        i
1b700 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1b710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b720 20 75 38 20 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b   u8 aBlob[2] = {
1b730 30 78 66 66 2c 20 30 78 66 66 7d 3b 0a 20 20 20  0xff, 0xff};.   
1b740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b750 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65  ind_int(pIdxSele
1b760 63 74 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a  ct, 1, iSegid);.
1b770 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b780 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78  3_bind_blob(pIdx
1b790 53 65 6c 65 63 74 2c 20 32 2c 20 61 42 6c 6f 62  Select, 2, aBlob
1b7a0 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , 2, SQLITE_STAT
1b7b0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  IC);.          a
1b7c0 73 73 65 72 74 5f 6e 63 28 20 73 71 6c 69 74 65  ssert_nc( sqlite
1b7d0 33 5f 73 74 65 70 28 70 49 64 78 53 65 6c 65 63  3_step(pIdxSelec
1b7e0 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)!=SQLITE_ROW )
1b7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
1b800 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
1b810 74 28 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  t(pIdxSelect);. 
1b820 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b830 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64 78 53  _bind_null(pIdxS
1b840 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20 20 20 20  elect, 2);.     
1b850 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1b860 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
1b870 20 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a   return iSegid;.
1b880 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
1b890 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e   all data curren
1b8a0 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68  tly cached in th
1b8b0 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a  e hash-tables..*
1b8c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1b8d0 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
1b8e0 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ta(Fts5Index *p)
1b8f0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
1b900 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  Hash || p->nPend
1b910 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  ingData==0 );.  
1b920 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a  if( p->pHash ){.
1b930 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1b940 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73  ashClear(p->pHas
1b950 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64  h);.    p->nPend
1b960 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ingData = 0;.  }
1b970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b980 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b990 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65   prefix, in byte
1b9a0 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 0a  s, that buffer .
1b9b0 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68  ** (pNew/<length
1b9c0 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72 65  -unknown>) share
1b9d0 73 20 77 69 74 68 20 62 75 66 66 65 72 20 28 70  s with buffer (p
1b9e0 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a  Old/nOld)..**.**
1b9f0 20 42 75 66 66 65 72 20 28 70 4e 65 77 2f 3c 6c   Buffer (pNew/<l
1ba00 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20  ength-unknown>) 
1ba10 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1ba20 20 62 65 20 67 72 65 61 74 65 72 20 0a 2a 2a 20   be greater .** 
1ba30 74 68 61 6e 20 62 75 66 66 65 72 20 28 70 4f 6c  than buffer (pOl
1ba40 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74  d/nOld)..*/.stat
1ba50 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69  ic int fts5Prefi
1ba60 78 43 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e 4f  xCompress(int nO
1ba70 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f  ld, const u8 *pO
1ba80 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e  ld, const u8 *pN
1ba90 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ew){.  int i;.  
1baa0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
1bab0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
1bac0 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20  Old[i]!=pNew[i] 
1bad0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
1bae0 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74  eturn i;.}..stat
1baf0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1bb00 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46  eDlidxClear(.  F
1bb10 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1bb20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1bb30 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  Writer,.  int bF
1bb40 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20  lush            
1bb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1bb60 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64  true, write dlid
1bb70 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a  x to disk */.){.
1bb80 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1bb90 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20  t( bFlush==0 || 
1bba0 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  (pWriter->nDlidx
1bbb0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  >0 && pWriter->a
1bbc0 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
1bbd0 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
1bbe0 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
1bbf0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  x; i++){.    Fts
1bc00 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
1bc10 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
1bc20 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
1bc30 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
1bc40 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  n==0 ) break;.  
1bc50 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a    if( bFlush ){.
1bc60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
1bc70 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b  lidx->pgno!=0 );
1bc80 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
1bc90 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
1bca0 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
1bcb0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1bcc0 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
1bcd0 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
1bce0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
1bcf0 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
1bd00 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
1bd10 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1bd20 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e  erZero(&pDlidx->
1bd30 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  buf);.    pDlidx
1bd40 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
1bd50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1bd60 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d  row the pWriter-
1bd70 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20  >aDlidx[] array 
1bd80 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c  to at least nLvl
1bd90 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a   elements in siz
1bda0 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72  e..** Any new ar
1bdb0 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ray elements are
1bdc0 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72   zeroed before r
1bdd0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1bde0 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74  tic int fts5Writ
1bdf0 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74  eDlidxGrow(.  Ft
1be00 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
1be10 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1be20 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c  iter,.  int nLvl
1be30 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
1be40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c  =SQLITE_OK && nL
1be50 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c  vl>=pWriter->nDl
1be60 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
1be70 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69  lidxWriter *aDli
1be80 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57  dx = (Fts5DlidxW
1be90 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  riter*)sqlite3_r
1bea0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
1beb0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c  pWriter->aDlidx,
1bec0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
1bed0 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a  xWriter) * nLvl.
1bee0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
1bef0 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Dlidx==0 ){.    
1bf00 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1bf10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1bf20 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  e{.      int nBy
1bf30 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1bf40 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28  DlidxWriter) * (
1bf50 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e  nLvl - pWriter->
1bf60 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d  nDlidx);.      m
1bf70 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57  emset(&aDlidx[pW
1bf80 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20  riter->nDlidx], 
1bf90 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
1bfa0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1bfb0 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20   = aDlidx;.     
1bfc0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
1bfd0 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20   = nLvl;.    }. 
1bfe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
1bff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
1c000 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
1c010 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c  st-index accumul
1c020 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72  ating in pWriter
1c030 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61  ->aDlidx[] is la
1c040 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66  rge.** enough, f
1c050 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20  lush it to disk 
1c060 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74  and return 1. Ot
1c070 68 65 72 77 69 73 65 20 64 69 73 63 61 72 64 20  herwise discard 
1c080 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  it and return.**
1c090 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
1c0a0 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c   int fts5WriteFl
1c0b0 75 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64  ushDlidx(Fts5Ind
1c0c0 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
1c0d0 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
1c0e0 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b    int bFlag = 0;
1c0f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1c100 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c  were FTS5_MIN_DL
1c110 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65  IDX_SIZE or more
1c120 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65   empty leaf page
1c130 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  s written.  ** t
1c140 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
1c150 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 64  also write the d
1c160 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20  oclist-index to 
1c170 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20  disk.  */.  if( 
1c180 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1c190 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57  0].buf.n>0 && pW
1c1a0 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
1c1b0 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
1c1c0 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20  ZE ){.    bFlag 
1c1d0 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57  = 1;.  }.  fts5W
1c1e0 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70  riteDlidxClear(p
1c1f0 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67  , pWriter, bFlag
1c200 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  );.  pWriter->nE
1c210 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  mpty = 0;.  retu
1c220 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a  rn bFlag;.}../*.
1c230 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c240 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
1c250 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ver processing o
1c260 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  f the doclist fo
1c270 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74  r the .** last t
1c280 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  erm on leaf page
1c290 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61   (pWriter->iBtPa
1c2a0 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64  ge) is completed
1c2b0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63  . .**.** The doc
1c2c0 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74  list-index for t
1c2d0 68 61 74 20 74 65 72 6d 20 69 73 20 63 75 72 72  hat term is curr
1c2e0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d  ently stored in-
1c2f0 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68  memory within th
1c300 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74  e.** Fts5SegWrit
1c310 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  er.aDlidx[] arra
1c320 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72 67  y. If it is larg
1c330 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66  e enough, this f
1c340 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65  unction.** write
1c350 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b  s it out to disk
1c360 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74  . Or, if it is t
1c370 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68  oo small to both
1c380 65 72 20 77 69 74 68 2c 20 64 69 73 63 61 72 64  er with, discard
1c390 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46  s.** it..**.** F
1c3a0 74 73 35 53 65 67 57 72 69 74 65 72 2e 62 74 74  ts5SegWriter.btt
1c3b0 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  erm currently co
1c3c0 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
1c3d0 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42   term on page iB
1c3e0 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
1c3f0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
1c400 6c 75 73 68 42 74 72 65 65 28 46 74 73 35 49 6e  lushBtree(Fts5In
1c410 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1c420 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1c430 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20  .  int bFlag;.. 
1c440 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1c450 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72  ->iBtPage || pWr
1c460 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20  iter->nEmpty==0 
1c470 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  );.  if( pWriter
1c480 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72  ->iBtPage==0 ) r
1c490 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d  eturn;.  bFlag =
1c4a0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44   fts5WriteFlushD
1c4b0 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65 72 29  lidx(p, pWriter)
1c4c0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
1c4d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c4e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1c4f0 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   (pWriter->btter
1c500 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61  m.n>0?(const cha
1c510 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65  r*)pWriter->btte
1c520 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a  rm.p:"");.    /*
1c530 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   The following w
1c540 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20  as already done 
1c550 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  in fts5WriteInit
1c560 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71  (): */.    /* sq
1c570 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c580 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1c590 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1c5a0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1c5b0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
1c5c0 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c  IdxWriter, 2, z,
1c5d0 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d   pWriter->btterm
1c5e0 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  .n, SQLITE_STATI
1c5f0 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
1c600 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49  bind_int64(p->pI
1c610 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c  dxWriter, 3, bFl
1c620 61 67 20 2b 20 28 28 69 36 34 29 70 57 72 69 74  ag + ((i64)pWrit
1c630 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29  er->iBtPage<<1))
1c640 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
1c650 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ep(p->pIdxWriter
1c660 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  );.    p->rc = s
1c670 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
1c680 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
1c690 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
1c6a0 6c 6c 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ll(p->pIdxWriter
1c6b0 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69  , 2);.  }.  pWri
1c6c0 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30  ter->iBtPage = 0
1c6d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c6e0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  is called once f
1c6f0 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67  or each leaf pag
1c700 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72  e except the fir
1c710 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  st that contains
1c720 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  .** at least one
1c730 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20   term. Argument 
1c740 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73  (nTerm/pTerm) is
1c750 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d   the split-key -
1c760 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20   a term that.** 
1c770 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  is larger than a
1c780 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e  ll terms written
1c790 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76   to earlier leav
1c7a0 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f  es, and equal to
1c7b0 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74   or.** smaller t
1c7c0 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65  han the first te
1c7d0 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65  rm on the new le
1c7e0 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  af..**.** If an 
1c7f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1c800 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
1c810 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78  eft in Fts5Index
1c820 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  .rc. If an error
1c830 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
1c840 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
1c850 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c860 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1c870 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c880 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
1c890 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49  reeTerm(.  Fts5I
1c8a0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1c8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1c8c0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1c8d0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
1c8e0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
1c8f0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1c900 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1c910 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38   nTerm, const u8
1c920 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20   *pTerm      /* 
1c930 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65  First term on ne
1c940 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66  w page */.){.  f
1c950 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1c960 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ee(p, pWriter);.
1c970 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
1c980 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72  &p->rc, &pWriter
1c990 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  ->btterm, nTerm,
1c9a0 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74   pTerm);.  pWrit
1c9b0 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57  er->iBtPage = pW
1c9c0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1c9d0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  no;.}../*.** Thi
1c9e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c9f0 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69  lled when flushi
1ca00 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  ng a leaf page t
1ca10 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  hat contains no.
1ca20 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c 6c 20  ** terms at all 
1ca30 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
1ca40 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1ca50 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20  eBtreeNoTerm(.  
1ca60 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1ca90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1caa0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1cab0 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er          /* W
1cac0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1cad0 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ){.  /* If there
1cae0 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64 73 20   were no rowids 
1caf0 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  on the leaf page
1cb00 20 65 69 74 68 65 72 20 61 6e 64 20 74 68 65 20   either and the 
1cb10 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20  doclist-index.  
1cb20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
1cb30 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61 70 70  een started, app
1cb40 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79 74 65  end an 0x00 byte
1cb50 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66   to it.  */.  if
1cb60 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1cb70 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26 26 20  tRowidInPage && 
1cb80 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1cb90 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20  0].buf.n>0 ){.  
1cba0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1cbb0 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
1cbc0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b  iter->aDlidx[0];
1cbd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c  .    assert( pDl
1cbe0 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1cbf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
1cc00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1cc10 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1cc20 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20  lidx->buf, 0);. 
1cc30 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
1cc40 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f  nt the "number o
1cc50 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c 65 61  f sequential lea
1cc60 76 65 73 20 77 69 74 68 6f 75 74 20 61 20 74 65  ves without a te
1cc70 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a  rm" counter. */.
1cc80 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
1cc90 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  y++;.}..static i
1cca0 36 34 20 66 74 73 35 44 6c 69 64 78 45 78 74 72  64 fts5DlidxExtr
1ccb0 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 46 74  actFirstRowid(Ft
1ccc0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b  s5Buffer *pBuf){
1ccd0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20  .  i64 iRowid;. 
1cce0 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f   int iOff;..  iO
1ccf0 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47 65 74  ff = 1 + fts5Get
1cd00 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1cd10 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69  1], (u64*)&iRowi
1cd20 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72  d);.  fts5GetVar
1cd30 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66  int(&pBuf->p[iOf
1cd40 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69  f], (u64*)&iRowi
1cd50 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f  d);.  return iRo
1cd60 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  wid;.}../*.** Ro
1cd70 77 69 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a  wid iRowid has j
1cd80 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ust been appende
1cd90 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
1cda0 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74 20 69   leaf page. It i
1cdb0 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f  s the.** first o
1cdc0 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  n the page. This
1cdd0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1cde0 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
1cdf0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75   entry to the cu
1ce00 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74  rrent.** doclist
1ce10 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69  -index..*/.stati
1ce20 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1ce30 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46  DlidxAppend(.  F
1ce40 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1ce50 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1ce60 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69  Writer, .  i64 i
1ce70 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69  Rowid.){.  int i
1ce80 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20  ;.  int bDone = 
1ce90 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70  0;..  for(i=0; p
1cea0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ceb0 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b  && bDone==0; i++
1cec0 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  ){.    i64 iVal;
1ced0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
1cee0 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
1cef0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1cf00 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c  i];..    if( pDl
1cf10 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70  idx->buf.n>=p->p
1cf20 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
1cf30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1cf40 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
1cf50 65 78 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e  ex page is full.
1cf60 20 57 72 69 74 65 20 69 74 20 74 6f 20 64 69 73   Write it to dis
1cf70 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20  k and push.     
1cf80 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52   ** a copy of iR
1cf90 6f 77 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c  owid (which will
1cfa0 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73   become the firs
1cfb0 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e  t rowid on the n
1cfc0 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63  ext.      ** doc
1cfd0 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20  list-index leaf 
1cfe0 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68  page) up into th
1cff0 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20  e next level of 
1d000 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20  the b-tree .    
1d010 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20    ** hierarchy. 
1d020 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e  If the node bein
1d030 67 20 66 6c 75 73 68 65 64 20 69 73 20 63 75 72  g flushed is cur
1d040 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20  rently the root 
1d050 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61  node,.      ** a
1d060 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66 69 72  lso push its fir
1d070 73 74 20 72 6f 77 69 64 20 75 70 77 61 72 64 73  st rowid upwards
1d080 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64  . */.      pDlid
1d090 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78  x->buf.p[0] = 0x
1d0a0 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68  01;    /* Not th
1d0b0 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  e root node */. 
1d0c0 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
1d0d0 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  te(p, .         
1d0e0 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
1d0f0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
1d100 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67  d, i, pDlidx->pg
1d110 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70  no),.          p
1d120 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44  Dlidx->buf.p, pD
1d130 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20  lidx->buf.n.    
1d140 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57    );.      fts5W
1d150 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c  riteDlidxGrow(p,
1d160 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a   pWriter, i+2);.
1d170 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26        pDlidx = &
1d180 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1d190 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  i];.      if( p-
1d1a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1d1b0 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e  & pDlidx[1].buf.
1d1c0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1d1d0 69 36 34 20 69 46 69 72 73 74 20 3d 20 66 74 73  i64 iFirst = fts
1d1e0 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72  5DlidxExtractFir
1d1f0 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d  stRowid(&pDlidx-
1d200 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20  >buf);..        
1d210 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68 65 20  /* This was the 
1d220 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20  root node. Push 
1d230 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20  its first rowid 
1d240 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f  up to the new ro
1d250 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ot. */.        p
1d260 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20  Dlidx[1].pgno = 
1d270 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20  pDlidx->pgno;.  
1d280 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d290 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d2a0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d2b0 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a  idx[1].buf, 0);.
1d2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1d2d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d2e0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d2f0 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44  Dlidx[1].buf, pD
1d300 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  lidx->pgno);.   
1d310 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d320 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d330 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d340 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73  dx[1].buf, iFirs
1d350 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69  t);.        pDli
1d360 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64  dx[1].bPrevValid
1d370 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44   = 1;.        pD
1d380 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20  lidx[1].iPrev = 
1d390 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a  iFirst;.      }.
1d3a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1d3b0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44  s5BufferZero(&pD
1d3c0 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20  lidx->buf);.    
1d3d0 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
1d3e0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
1d3f0 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a  pDlidx->pgno++;.
1d400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d410 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20   bDone = 1;.    
1d420 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  }..    if( pDlid
1d430 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b  x->bPrevValid ){
1d440 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52  .      iVal = iR
1d450 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69  owid - pDlidx->i
1d460 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
1d470 0a 20 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f  .      i64 iPgno
1d480 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74   = (i==0 ? pWrit
1d490 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20  er->writer.pgno 
1d4a0 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e  : pDlidx[-1].pgn
1d4b0 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
1d4c0 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d  ( pDlidx->buf.n=
1d4d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1d4e0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d4f0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d500 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
1d510 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73  !bDone);.      s
1d520 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d530 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d540 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
1d550 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20  f, iPgno);.     
1d560 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a   iVal = iRowid;.
1d570 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
1d580 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1d590 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1d5a0 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69   &pDlidx->buf, i
1d5b0 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  Val);.    pDlidx
1d5c0 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ->bPrevValid = 1
1d5d0 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 69 50  ;.    pDlidx->iP
1d5e0 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  rev = iRowid;.  
1d5f0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1d600 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1d610 65 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eaf(Fts5Index *p
1d620 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
1d630 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61  *pWriter){.  sta
1d640 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1d650 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78  o[] = { 0x00, 0x
1d660 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
1d670 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  ;.  Fts5PageWrit
1d680 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1d690 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1d6a0 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61  i64 iRowid;..  a
1d6b0 73 73 65 72 74 28 20 28 70 50 61 67 65 2d 3e 70  ssert( (pPage->p
1d6c0 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72  gidx.n==0)==(pWr
1d6d0 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1d6e0 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  InPage) );..  /*
1d6f0 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
1d700 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f  header field. */
1d710 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74  .  assert( 0==ft
1d720 73 35 47 65 74 55 31 36 28 26 70 50 61 67 65 2d  s5GetU16(&pPage-
1d730 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20  >buf.p[2]) );.  
1d740 66 74 73 35 50 75 74 55 31 36 28 26 70 50 61 67  fts5PutU16(&pPag
1d750 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31  e->buf.p[2], (u1
1d760 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  6)pPage->buf.n);
1d770 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ..  if( pWriter-
1d780 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1d790 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74  e ){.    /* No t
1d7a0 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20  erm was written 
1d7b0 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f  to this page. */
1d7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d7d0 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 20 29  ge->pgidx.n==0 )
1d7e0 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42  ;.    fts5WriteB
1d7f0 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57  treeNoTerm(p, pW
1d800 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  riter);.  }else{
1d810 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
1d820 68 65 20 70 67 69 64 78 20 74 6f 20 74 68 65 20  he pgidx to the 
1d830 70 61 67 65 20 62 75 66 66 65 72 2e 20 53 65 74  page buffer. Set
1d840 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64   the szLeaf head
1d850 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  er field. */.   
1d860 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1d870 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1d880 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61 67 65  Page->buf, pPage
1d890 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61 67 65  ->pgidx.n, pPage
1d8a0 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20 7d 0a  ->pgidx.p);.  }.
1d8b0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
1d8c0 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69 73 6b  page out to disk
1d8d0 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46   */.  iRowid = F
1d8e0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1d8f0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
1d900 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  d, pPage->pgno);
1d910 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
1d920 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
1d930 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
1d940 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49  >buf.n);..  /* I
1d950 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65  nitialize the ne
1d960 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  xt page. */.  ft
1d970 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
1d980 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  age->buf);.  fts
1d990 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
1d9a0 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74  ge->pgidx);.  ft
1d9b0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1d9c0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1d9d0 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29  e->buf, 4, zero)
1d9e0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76  ;.  pPage->iPrev
1d9f0 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70 50 61  Pgidx = 0;.  pPa
1da00 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ge->pgno++;..  /
1da10 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c  * Increase the l
1da20 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f  eaves written co
1da30 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74  unter */.  pWrit
1da40 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e  er->nLeafWritten
1da50 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
1da60 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20  w leaf holds no 
1da70 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20  terms or rowids 
1da80 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  */.  pWriter->bF
1da90 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
1daa0 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
1dab0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1dac0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 1;.}../*.** A
1dad0 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d  ppend term pTerm
1dae0 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65  /nTerm to the se
1daf0 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
1db00 74 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65  ten by the write
1db10 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
1db20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1db30 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
1db40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
1db50 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
1db60 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
1db70 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
1db80 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1db90 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1dba0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1dbb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1dbc0 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
1dbd0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
1dbe0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1dbf0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
1dc00 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
1dc10 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20   u8 *pTerm .){. 
1dc20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65   /* Bytes of pre
1dc50 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
1dc60 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74  for term */.  Ft
1dc70 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
1dc80 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1dc90 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35 42 75  writer;.  Fts5Bu
1dca0 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d 20 26  ffer *pPgidx = &
1dcb0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1dcc0 70 67 69 64 78 3b 0a 0a 20 20 61 73 73 65 72 74  pgidx;..  assert
1dcd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1dce0 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
1dcf0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20  pPage->buf.n>=4 
1dd00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1dd10 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c 20 70  ge->buf.n>4 || p
1dd20 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1dd30 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20 20 2f  rmInPage );..  /
1dd40 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1dd50 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75   leaf page is fu
1dd60 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20  ll, flush it to 
1dd70 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 28  disk. */.  if( (
1dd80 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
1dd90 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d  Pgidx->n + nTerm
1dda0 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69   + 2)>=p->pConfi
1ddb0 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69  g->pgsz ){.    i
1ddc0 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
1ddd0 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  4 ){.      fts5W
1dde0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1ddf0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
1de00 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47  .    fts5BufferG
1de10 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  row(&p->rc, &pPa
1de20 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b 46  ge->buf, nTerm+F
1de30 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1de40 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  );.  }.  .  /* T
1de50 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20 70  ODO1: Updating p
1de60 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20 20  gidx here. */.  
1de70 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c  pPgidx->n += sql
1de80 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e  ite3Fts5PutVarin
1de90 74 28 0a 20 20 20 20 20 20 26 70 50 67 69 64 78  t(.      &pPgidx
1dea0 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20  ->p[pPgidx->n], 
1deb0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70  pPage->buf.n - p
1dec0 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78  Page->iPrevPgidx
1ded0 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  .  );.  pPage->i
1dee0 50 72 65 76 50 67 69 64 78 20 3d 20 70 50 61 67  PrevPgidx = pPag
1def0 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30 0a  e->buf.n;.#if 0.
1df00 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50    fts5PutU16(&pP
1df10 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e  gidx->p[pPgidx->
1df20 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  n], pPage->buf.n
1df30 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b  );.  pPgidx->n +
1df40 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  = 2;.#endif..  i
1df50 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
1df60 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a  stTermInPage ){.
1df70 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b      nPrefix = 0;
1df80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1df90 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20  pgno!=1 ){.     
1dfa0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
1dfb0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61 20  first term on a 
1dfc0 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f 74  leaf that is not
1dfd0 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c 65   the leftmost le
1dfe0 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74  af in.      ** t
1dff0 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  he segment b-tre
1e000 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1e010 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
1e020 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74 6f  to add a term to
1e030 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62 2d  .      ** the b-
1e040 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 74  tree hierarchy t
1e050 68 61 74 20 69 73 20 28 61 29 20 6c 61 72 67 65  hat is (a) large
1e060 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
1e070 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20 2a  st term .      *
1e080 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  * already writte
1e090 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  n to the segment
1e0a0 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65 72   and (b) smaller
1e0b0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1e0c0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  o.      ** this 
1e0d0 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20 77  term. In other w
1e0e0 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78 20 6f  ords, a prefix o
1e0f0 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  f (pTerm/nTerm) 
1e100 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20 20  that is one.    
1e110 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65 72    ** byte longer
1e120 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65 73   than the longes
1e130 74 20 70 72 65 66 69 78 20 28 70 54 65 72 6d 2f  t prefix (pTerm/
1e140 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20 77 69  nTerm) shares wi
1e150 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  th the.      ** 
1e160 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 0a  previous term. .
1e170 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1e180 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70  * Usually, the p
1e190 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20  revious term is 
1e1a0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50 61  available in pPa
1e1b0 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65 78  ge->term. The ex
1e1c0 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ception.      **
1e1d0 20 69 73 20 69 66 20 74 68 69 73 20 69 73 20 74   is if this is t
1e1e0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72  he first term wr
1e1f0 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63 72  itten in an incr
1e200 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73 74  emental-merge st
1e210 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  ep..      ** In 
1e220 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 72  this case the pr
1e230 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 6e  evious term is n
1e240 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f  ot available, so
1e250 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20 20   just write a.  
1e260 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 28      ** copy of (
1e270 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e 74  pTerm/nTerm) int
1e280 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64  o the parent nod
1e290 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68  e. This is sligh
1e2a0 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 65  tly.      ** ine
1e2b0 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73 74  fficient, but st
1e2c0 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f  ill correct.  */
1e2d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e  .      int n = n
1e2e0 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  Term;.      if( 
1e2f0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b  pPage->term.n ){
1e300 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20 2b  .        n = 1 +
1e310 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
1e320 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  ess(pPage->term.
1e330 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
1e340 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1e350 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  }.      fts5Writ
1e360 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57  eBtreeTerm(p, pW
1e370 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29  riter, n, pTerm)
1e380 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1e390 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1e3a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1e3b0 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66  .    nPrefix = f
1e3c0 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
1e3d0 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  s(pPage->term.n,
1e3e0 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
1e3f0 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35  pTerm);.    fts5
1e400 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e410 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e420 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78 29  e->buf, nPrefix)
1e430 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1e440 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
1e450 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   bytes of new da
1e460 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72  ta, then the ter
1e470 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20 20  m data itself.  
1e480 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
1e490 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  */.  fts5BufferA
1e4a0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e4b0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e4c0 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
1e4d0 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
1e4e0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1e4f0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1e500 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20  Term - nPrefix, 
1e510 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29  &pTerm[nPrefix])
1e520 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
1e530 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74 65  he Fts5PageWrite
1e540 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f  r.term field. */
1e550 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
1e560 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1e570 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  >term, nTerm, pT
1e580 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
1e590 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1e5a0 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74 65  e = 0;..  pWrite
1e5b0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1e5c0 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69  Page = 0;.  pWri
1e5d0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e5e0 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a  InDoclist = 1;..
1e5f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
1e600 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c  || (pWriter->nDl
1e610 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72  idx>0 && pWriter
1e620 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1e630 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69 74  n==0) );.  pWrit
1e640 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67  er->aDlidx[0].pg
1e650 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
1e660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1e670 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70 6f  d a rowid and po
1e680 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
1e690 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72   field to the wr
1e6a0 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
1e6b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1e6c0 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
1e6d0 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
1e6e0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1e6f0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
1e700 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
1e710 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1e720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
1e730 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1e740 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1e750 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  riter;..    if( 
1e760 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
1e770 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e  pPage->pgidx.n)>
1e780 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1e790 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  z ){.      fts5W
1e7a0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1e7b0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
1e7c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1e7d0 20 69 73 20 74 6f 20 62 65 20 74 68 65 20 66 69   is to be the fi
1e7e0 72 73 74 20 72 6f 77 69 64 20 77 72 69 74 74 65  rst rowid writte
1e7f0 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73  n to the page, s
1e800 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  et the .    ** r
1e810 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20  owid-pointer in 
1e820 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 2e  the page-header.
1e830 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61 20 76   Also append a v
1e840 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c 69 64  alue to the dlid
1e850 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2c  x.    ** buffer,
1e860 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69   in case a docli
1e870 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75  st-index is requ
1e880 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ired.  */.    if
1e890 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1e8a0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1e8b0 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1e8c0 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 28  (pPage->buf.p, (
1e8d0 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
1e8e0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
1e8f0 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
1e900 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64   pWriter, iRowid
1e910 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1e920 20 57 72 69 74 65 20 74 68 65 20 72 6f 77 69 64   Write the rowid
1e930 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72  . */.    if( pWr
1e940 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1e950 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57  dInDoclist || pW
1e960 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1e970 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1e980 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1e990 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1e9a0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
1e9b0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  owid);.    }else
1e9c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e9d0 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e  p->rc || iRowid>
1e9e0 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1e9f0 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73  wid );.      fts
1ea00 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1ea10 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
1ea20 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20  ge->buf, iRowid 
1ea30 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76  - pWriter->iPrev
1ea40 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
1ea50 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76    pWriter->iPrev
1ea60 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1ea70 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
1ea80 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1ea90 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74  t = 0;.    pWrit
1eaa0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1eab0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nPage = 0;.  }.}
1eac0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1ead0 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1eae0 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
1eaf0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1eb00 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1eb10 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
1eb20 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
1eb30 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
1eb40 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
1eb50 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1eb60 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  ter;.  const u8 
1eb70 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e  *a = aData;.  in
1eb80 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a  t n = nData;.  .
1eb90 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
1eba0 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a  nfig->pgsz>0 );.
1ebb0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1ebc0 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
1ebd0 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  && (pPage->buf.n
1ebe0 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   + pPage->pgidx.
1ebf0 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  n + n)>=p->pConf
1ec00 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20  ig->pgsz .  ){. 
1ec10 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d     int nReq = p-
1ec20 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d  >pConfig->pgsz -
1ec30 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20   pPage->buf.n - 
1ec40 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a  pPage->pgidx.n;.
1ec50 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1ec60 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43  0;.    while( nC
1ec70 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20  opy<nReq ){.    
1ec80 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20    i64 dummy;.   
1ec90 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35     nCopy += fts5
1eca0 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f  GetVarint(&a[nCo
1ecb0 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d  py], (u64*)&dumm
1ecc0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  y);.    }.    ft
1ecd0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1ece0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1ecf0 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61  e->buf, nCopy, a
1ed00 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70  );.    a += nCop
1ed10 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70  y;.    n -= nCop
1ed20 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  y;.    fts5Write
1ed30 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1ed40 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iter);.  }.  if(
1ed50 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35   n>0 ){.    fts5
1ed60 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1ed70 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1ed80 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d  >buf, n, a);.  }
1ed90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1eda0 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20  any data cached 
1edb0 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62  by the writer ob
1edc0 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61  ject to the data
1edd0 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a  base. Free any.*
1ede0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  * allocations as
1edf0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1ee00 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61  e writer..*/.sta
1ee10 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1ee20 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35  teFinish(.  Fts5
1ee30 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1ee40 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1ee50 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1ee60 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
1ee70 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20  .  int *pnLeaf  
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
1eea0 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
1eeb0 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a  in b-tree */.){.
1eec0 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50    int i;.  Fts5P
1eed0 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66  ageWriter *pLeaf
1eee0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1eef0 74 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ter;.  if( p->rc
1ef00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ef10 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66     assert( pLeaf
1ef20 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20  ->pgno>=1 );.   
1ef30 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e   if( pLeaf->buf.
1ef40 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
1ef50 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1ef60 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1ef70 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d   }.    *pnLeaf =
1ef80 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a   pLeaf->pgno-1;.
1ef90 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70      if( pLeaf->p
1efa0 67 6e 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66  gno>1 ){.      f
1efb0 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1efc0 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ee(p, pWriter);.
1efd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1efe0 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1eff0 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  f->term);.  fts5
1f000 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1f010 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  f->buf);.  fts5B
1f020 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1f030 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35  ->pgidx);.  fts5
1f040 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
1f050 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20  ter->btterm);.. 
1f060 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
1f070 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
1f080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
1f090 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
1f0a0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
1f0b0 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  .buf);.  }.  sql
1f0c0 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
1f0d0 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73  r->aDlidx);.}..s
1f0e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1f0f0 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35  riteInit(.  Fts5
1f100 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1f110 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1f120 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67  ter, .  int iSeg
1f130 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  id.){.  const in
1f140 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70  t nBuffer = p->p
1f150 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46  Config->pgsz + F
1f160 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1f170 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69  ;..  memset(pWri
1f180 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
1f190 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
1f1a0 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69    pWriter->iSegi
1f1b0 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66  d = iSegid;..  f
1f1c0 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1f1d0 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29  w(p, pWriter, 1)
1f1e0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69  ;.  pWriter->wri
1f1f0 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ter.pgno = 1;.  
1f200 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1f210 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
1f220 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1f230 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
1f240 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ( pWriter->write
1f250 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20  r.buf.n==0 );.  
1f260 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1f270 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d  >writer.pgidx.n=
1f280 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77  =0 );..  /* Grow
1f290 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
1f2a0 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69   to pgsz + paddi
1f2b0 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ng bytes in size
1f2c0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74  . */.  sqlite3Ft
1f2d0 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
1f2e0 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
1f2f0 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75  riter.pgidx, nBu
1f300 66 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ffer);.  sqlite3
1f310 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
1f320 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
1f330 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75  >writer.buf, nBu
1f340 66 66 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ffer);..  if( p-
1f350 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29  >pIdxWriter==0 )
1f360 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
1f370 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
1f380 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
1f390 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
1f3a0 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74  (p, &p->pIdxWrit
1f3b0 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
1f3c0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
1f3d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27  INSERT INTO '%q'
1f3e0 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c  .'%q_idx'(segid,
1f3f0 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45  term,pgno) VALUE
1f400 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20  S(?,?,?)", .    
1f410 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
1f420 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
1f430 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a  me.    ));.  }..
1f440 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1f450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
1f460 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1f470 34 2d 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65  4-byte leaf-page
1f480 20 68 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e   header to 0x00.
1f490 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
1f4a0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f4b0 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20  uf.p, 0, 4);.   
1f4c0 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1f4d0 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20  .buf.n = 4;..   
1f4e0 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72   /* Bind the cur
1f4f0 72 65 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d  rent output segm
1f500 65 6e 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e  ent id to the in
1f510 64 65 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73  dex-writer. This
1f520 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70   is an.    ** op
1f530 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20  timization over 
1f540 62 69 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65  binding the same
1f550 20 76 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20   value over and 
1f560 6f 76 65 72 20 61 73 20 72 6f 77 73 20 61 72 65  over as rows are
1f570 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64  .    ** inserted
1f580 20 69 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74   into %_idx by t
1f590 68 65 20 63 75 72 72 65 6e 74 20 77 72 69 74 65  he current write
1f5a0 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r.  */.    sqlit
1f5b0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
1f5c0 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57  IdxWriter, 1, pW
1f5d0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a  riter->iSegid);.
1f5e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
1f5f0 72 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20  rator pIter was 
1f600 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1f610 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75  through the inpu
1f620 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e  t segments of on
1f630 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   an.** increment
1f640 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al merge operati
1f650 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
1f660 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  n is called if t
1f670 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a  he incremental.*
1f680 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73  * merge step has
1f690 20 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68   finished but th
1f6a0 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20  e input has not 
1f6b0 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
1f6c0 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  exhausted..*/.st
1f6d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72  atic void fts5Tr
1f6e0 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49  imSegments(Fts5I
1f6f0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
1f700 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
1f710 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   i;.  Fts5Buffer
1f720 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
1f730 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
1f740 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66  ts5Buffer));.  f
1f750 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1f760 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
1f770 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1f780 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
1f790 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  g[i];.    if( pS
1f7a0 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20  eg->pSeg==0 ){. 
1f7b0 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
1f7c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1f7d0 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b  Seg->pLeaf==0 ){
1f7e0 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65  .      /* All ke
1f7f0 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70  ys from this inp
1f800 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20  ut segment have 
1f810 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20  been transfered 
1f820 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20  to the output.. 
1f830 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68       ** Set both
1f840 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c   the first and l
1f850 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ast page-numbers
1f860 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
1f870 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
1f880 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e   ** segment is n
1f890 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  ow empty. */.   
1f8a0 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1f8b0 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20  gnoLast = 0;.   
1f8c0 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1f8d0 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  gnoFirst = 0;.  
1f8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1f8f0 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e  nt iOff = pSeg->
1f900 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
1f910 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1f920 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66  n new first leaf
1f930 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
1f940 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20  64 iLeafRowid;. 
1f950 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
1f960 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  Data;.      int 
1f970 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67  iId = pSeg->pSeg
1f980 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ->iSegid;.      
1f990 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78  u8 aHdr[4] = {0x
1f9a0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
1f9b0 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c  0x00};..      iL
1f9c0 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  eafRowid = FTS5_
1f9d0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1f9e0 64 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65  d, pSeg->iTermLe
1f9f0 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  afPgno);.      p
1fa00 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
1fa10 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ead(p, iLeafRowi
1fa20 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  d);.      if( pD
1fa30 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ata ){.        f
1fa40 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62  ts5BufferZero(&b
1fa50 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
1fa60 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1fa70 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1fa80 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  >nn);.        ft
1fa90 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1faa0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1fab0 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
1fac0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
1fad0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fae0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1faf0 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
1fb00 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1fb10 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1fb20 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1fb30 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
1fb40 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
1fb50 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fb60 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1fb70 62 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65  buf, pData->szLe
1fb80 61 66 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d  af-iOff, &pData-
1fb90 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  >p[iOff]);.     
1fba0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1fbb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fbc0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1fbd0 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a  szLeaf field */.
1fbe0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75            fts5Pu
1fbf0 74 55 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20  tU16(&buf.p[2], 
1fc00 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20  (u16)buf.n);.   
1fc10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1fc20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e 65  /* Set up the ne
1fc30 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72 72  w page-index arr
1fc40 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ay */.        ft
1fc50 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fc60 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1fc70 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69  f, 4);.        i
1fc80 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67  f( pSeg->iLeafPg
1fc90 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72 6d 4c  no==pSeg->iTermL
1fca0 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20 20 20  eafPgno .       
1fcb0 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f    && pSeg->iEndo
1fcc0 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e  fDoclist<pData->
1fcd0 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20 20  szLeaf .        
1fce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1fcf0 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61 2d 3e   nDiff = pData->
1fd00 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69  szLeaf - pSeg->i
1fd10 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20  EndofDoclist;.  
1fd20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fd30 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1fd40 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62 75 66  p->rc, &buf, buf
1fd50 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66 20 2d  .n - 1 - nDiff -
1fd60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   4);.          f
1fd70 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1fd80 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1fd90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1fda0 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70 53 65   pData->nn - pSe
1fdb0 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20 26 70  g->iPgidxOff, &p
1fdc0 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e 69 50  Data->p[pSeg->iP
1fdd0 67 69 64 78 4f 66 66 5d 0a 20 20 20 20 20 20 20  gidxOff].       
1fde0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
1fdf0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1fe00 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
1fe10 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
1fe20 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1fe30 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1fe40 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74  Pgno;.        ft
1fe50 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
1fe60 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1fe70 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c 65 61  ID(iId, 1), iLea
1fe80 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  fRowid);.       
1fe90 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1fea0 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75  , iLeafRowid, bu
1feb0 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
1fec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1fed0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1fee0 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  &buf);.}..static
1fef0 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43   void fts5MergeC
1ff00 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20  hunkCallback(.  
1ff10 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1ff20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
1ff30 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
1ff40 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
1ff50 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1ff60 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  *pWriter = (Fts5
1ff70 53 65 67 57 72 69 74 65 72 2a 29 70 43 74 78 3b  SegWriter*)pCtx;
1ff80 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65  .  fts5WriteAppe
1ff90 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c  ndPoslistData(p,
1ffa0 20 70 57 72 69 74 65 72 2c 20 70 43 68 75 6e 6b   pWriter, pChunk
1ffb0 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a  , nChunk);.}../*
1ffc0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
1ffd0 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67  id fts5IndexMerg
1ffe0 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e  eLevel(.  Fts5In
1fff0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
20000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
20010 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
20020 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
20030 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
20040 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
20050 20 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64   Stucture of ind
20060 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  ex */.  int iLvl
20070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20080 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
20090 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66   to read input f
200a0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rom */.  int *pn
200b0 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Rem             
200c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
200d0 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e  e up to this man
200e0 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  y output leaves 
200f0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
20100 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
20110 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74   *ppStruct;.  Ft
20120 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
20130 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
20140 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
20150 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
20160 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a  Level *pLvlOut;.
20170 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
20180 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
20190 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64  Iterator to read
201a0 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20   input data */. 
201b0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65   int nRem = pnRe
201c0 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20  m ? *pnRem : 0; 
201d0 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20   /* Output leaf 
201e0 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
201f0 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ite */.  int nIn
20200 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
20210 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20220 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
20230 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  ents */.  Fts5Se
20240 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
20250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
20260 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
20270 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
20280 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
20290 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e  /* Output segmen
202a0 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
202b0 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f  r term;.  int bO
202c0 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  ldest;          
202d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
202e0 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  e if the output 
202f0 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f  segment is the o
20300 6c 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ldest */.  int e
20310 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
20320 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
20330 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
20340 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  = FTS5INDEX_QUER
20350 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 69 6e  Y_NOOUTPUT;.  in
20360 74 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20 3d  t bTermWritten =
20370 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
20380 20 54 72 75 65 20 69 66 20 63 75 72 72 65 6e 74   True if current
20390 20 74 65 72 6d 20 61 6c 72 65 61 64 79 20 6f 75   term already ou
203a0 74 70 75 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tput */..  asser
203b0 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  t( iLvl<pStruct-
203c0 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73  >nLevel );.  ass
203d0 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
203e0 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
203f0 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74  ..  memset(&writ
20400 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
20410 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
20420 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
20430 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
20440 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76  fer));.  if( pLv
20450 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
20460 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
20470 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
20480 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1];.    assert(
20490 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30   pLvlOut->nSeg>0
204a0 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   );.    nInput =
204b0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
204c0 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
204d0 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
204e0 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20  ->nSeg-1];..    
204f0 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
20500 20 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e   &writer, pSeg->
20510 69 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69  iSegid);.    wri
20520 74 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20  ter.writer.pgno 
20530 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
20540 2b 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69  +1;.    writer.i
20550 42 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  BtPage = 0;.  }e
20560 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  lse{.    int iSe
20570 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61  gid = fts5Alloca
20580 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75  teSegid(p, pStru
20590 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  ct);..    /* Ext
205a0 65 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75  end the Fts5Stru
205b0 63 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20  cture object as 
205c0 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75  required to ensu
205d0 72 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  re the output.  
205e0 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69    ** segment exi
205f0 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sts. */.    if( 
20600 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e  iLvl==pStruct->n
20610 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20  Level-1 ){.     
20620 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
20630 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
20640 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
20650 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
20660 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  uct;.    }.    f
20670 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
20680 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
20690 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c  pStruct, iLvl+1,
206a0 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
206b0 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
206c0 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
206d0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
206e0 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ];.    pLvlOut =
206f0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
20700 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20  l[iLvl+1];..    
20710 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
20720 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64   &writer, iSegid
20730 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  );..    /* Add t
20740 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74  he new segment t
20750 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76  o the output lev
20760 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d  el */.    pSeg =
20770 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
20780 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a  pLvlOut->nSeg];.
20790 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
207a0 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70  g++;.    pSeg->p
207b0 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
207c0 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d    pSeg->iSegid =
207d0 20 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74   iSegid;.    pSt
207e0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b  ruct->nSegment++
207f0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69  ;..    /* Read i
20800 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65  nput from all se
20810 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  gments in the in
20820 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
20830 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
20840 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64  nSeg;.  }.  bOld
20850 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e  est = (pLvlOut->
20860 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75  nSeg==1 && pStru
20870 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c  ct->nLevel==iLvl
20880 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  +2);..  assert( 
20890 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72  iLvl>=0 );.  for
208a0 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
208b0 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
208c0 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c  ags, 0, 0, 0, iL
208d0 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74  vl, nInput, &pIt
208e0 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  er);.      fts5M
208f0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
20900 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  Iter)==0;.      
20910 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
20920 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
20930 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53  ).  ){.    Fts5S
20940 65 67 49 74 65 72 20 2a 70 53 65 67 49 74 65 72  egIter *pSegIter
20950 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
20960 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
20970 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
20980 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20  int nPos;       
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209a0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
209b0 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20  ize field value 
209c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  */.    int nTerm
209d0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  ;.    const u8 *
209e0 70 54 65 72 6d 3b 0a 0a 20 20 20 20 70 54 65 72  pTerm;..    pTer
209f0 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  m = fts5MultiIte
20a00 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54  rTerm(pIter, &nT
20a10 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54  erm);.    if( nT
20a20 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d  erm!=term.n || m
20a30 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72  emcmp(pTerm, ter
20a40 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20  m.p, nTerm) ){. 
20a50 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26       if( pnRem &
20a60 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  & writer.nLeafWr
20a70 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20  itten>nRem ){.  
20a80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20a90 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42     }.      fts5B
20aa0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
20ab0 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70   &term, nTerm, p
20ac0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 54 65  Term);.      bTe
20ad0 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b 0a 20 20  rmWritten =0;.  
20ae0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
20af0 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69  k for key annihi
20b00 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  lation. */.    i
20b10 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f  f( pSegIter->nPo
20b20 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74  s==0 && (bOldest
20b30 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44   || pSegIter->bD
20b40 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  el==0) ) continu
20b50 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  e;..    if( p->r
20b60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20b70 62 54 65 72 6d 57 72 69 74 74 65 6e 3d 3d 30 20  bTermWritten==0 
20b80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
20b90 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20   is a new term. 
20ba0 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f  Append a term to
20bb0 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
20bc0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74  ent. */.      ft
20bd0 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
20be0 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54  m(p, &writer, nT
20bf0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
20c00 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20     bTermWritten 
20c10 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
20c20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f  /* Append the ro
20c30 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  wid to the outpu
20c40 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54  t */.    /* WRIT
20c50 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
20c60 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
20c70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69  endRowid(p, &wri
20c80 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74  ter, fts5MultiIt
20c90 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b  erRowid(pIter));
20ca0 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
20cb0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
20cc0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
20cd0 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 20   pSegIter->bDel 
20ce0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
20cf0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
20d00 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65  t(&p->rc, &write
20d10 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29  r.writer.buf, 0)
20d20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
20d30 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20 29  egIter->nPos>0 )
20d40 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
20d50 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20d60 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74  nt(&p->rc, &writ
20d70 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30  er.writer.buf, 0
20d80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20d90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
20da0 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
20db0 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
20dc0 74 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75  t data to the ou
20dd0 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e 50  tput */.      nP
20de0 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e  os = pSegIter->n
20df0 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72  Pos*2 + pSegIter
20e00 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 66 74  ->bDel;.      ft
20e10 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20e20 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
20e30 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
20e40 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 66 74   nPos);.      ft
20e50 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
20e60 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76 6f 69  , pSegIter, (voi
20e70 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73 35  d*)&writer, fts5
20e80 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61  MergeChunkCallba
20e90 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ck);.    }.  }..
20ea0 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c    /* Flush the l
20eb0 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f  ast leaf page to
20ec0 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f   disk. Set the o
20ed0 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d  utput segment b-
20ee0 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a  tree height.  **
20ef0 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70   and last leaf p
20f00 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68  age number at th
20f10 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f  e same time.  */
20f20 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69  .  fts5WriteFini
20f30 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
20f40 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b  pSeg->pgnoLast);
20f50 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74  ..  if( fts5Mult
20f60 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
20f70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  r) ){.    int i;
20f80 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
20f90 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65  the redundant se
20fa0 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
20fb0 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
20fc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
20fd0 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Input; i++){.   
20fe0 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76     fts5DataRemov
20ff0 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c  eSegment(p, pLvl
21000 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64  ->aSeg[i].iSegid
21010 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
21020 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75   Remove the redu
21030 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66  ndant segments f
21040 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65  rom the input le
21050 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  vel */.    if( p
21060 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75  Lvl->nSeg!=nInpu
21070 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
21080 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Move = (pLvl->nS
21090 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73  eg - nInput) * s
210a0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
210b0 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
210c0 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d     memmove(pLvl-
210d0 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53  >aSeg, &pLvl->aS
210e0 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76  eg[nInput], nMov
210f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  e);.    }.    pS
21100 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20  truct->nSegment 
21110 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70  -= nInput;.    p
21120 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e  Lvl->nSeg -= nIn
21130 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  put;.    pLvl->n
21140 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69  Merge = 0;.    i
21150 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  f( pSeg->pgnoLas
21160 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  t==0 ){.      pL
21170 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20  vlOut->nSeg--;. 
21180 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53       pStruct->nS
21190 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a  egment--;.    }.
211a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
211b0 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  ert( pSeg->pgnoL
211c0 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73  ast>0 );.    fts
211d0 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c  5TrimSegments(p,
211e0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76   pIter);.    pLv
211f0 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70  l->nMerge = nInp
21200 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d  ut;.  }..  fts5M
21210 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
21220 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
21230 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
21240 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52  if( pnRem ) *pnR
21250 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65  em -= writer.nLe
21260 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  afWritten;.}../*
21270 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67  .** Do up to nPg
21280 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65   pages of autome
21290 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20  rge work on the 
212a0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  index..**.** Ret
212b0 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
212c0 63 68 61 6e 67 65 73 20 77 65 72 65 20 61 63 74  changes were act
212d0 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72 20 66  ually made, or f
212e0 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
212f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
21300 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20  s5IndexMerge(.  
21310 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
21340 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
21350 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
21360 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
21370 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
21380 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
21390 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 2c 20  x */.  int nPg, 
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
213c0 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f  of work to do */
213d0 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20 20 20  .  int nMin     
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75     /* Minimum nu
21400 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
21410 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
21420 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67    int nRem = nPg
21430 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30  ;.  int bRet = 0
21440 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
21450 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
21460 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28  Struct;.  while(
21470 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63   nRem>0 && p->rc
21480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21490 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
214b0 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
214c0 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
214d0 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20     int iBestLvl 
214e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
214f0 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67  * Level offering
21500 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20   the most input 
21510 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
21520 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20  int nBest = 0;  
21530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21540 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73  umber of input s
21550 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20  egments on best 
21560 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a  level */..    /*
21570 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f   Set iBestLvl to
21580 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65   the level to re
21590 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  ad input segment
215a0 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61  s from. */.    a
215b0 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
215c0 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20  nLevel>0 );.    
215d0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
215e0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
215f0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
21600 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
21610 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
21620 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
21630 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
21640 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
21650 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
21660 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a  nMerge>nBest ){.
21670 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c            iBestL
21680 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
21690 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
216a0 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20  l->nMerge;.     
216b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
216c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
216d0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
216e0 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nBest ){.      
216f0 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
21700 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42  nSeg;.        iB
21710 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
21720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
21730 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73    /* If nBest is
21740 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74   still 0, then t
21750 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
21760 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65   empty. */.#ifde
21770 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21780 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e     for(iLvl=0; n
21790 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c  Best==0 && iLvl<
217a0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
217b0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
217c0 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
217d0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
217e0 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23  eg==0 );.    }.#
217f0 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e  endif..    if( n
21800 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70 53 74  Best<nMin && pSt
21810 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
21820 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
21830 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
21840 0a 20 20 20 20 7d 0a 20 20 20 20 62 52 65 74 20  .    }.    bRet 
21850 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  = 1;.    fts5Ind
21860 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
21870 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
21880 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
21890 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
218a0 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
218b0 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
218c0 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ].nMerge==0 ){. 
218d0 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
218e0 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65  rePromote(p, iBe
218f0 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74  stLvl+1, pStruct
21900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
21910 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
21920 63 74 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  ct;.  return bRe
21930 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f  t;.}../*.** A to
21940 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61  tal of nLeaf lea
21950 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20  f pages of data 
21960 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c  has just been fl
21970 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c  ushed to a level
21980 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54  -0.** segment. T
21990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64  his function upd
219a0 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 63  ates the write-c
219b0 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67  ounter according
219c0 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65  ly and, if.** ne
219d0 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d  cessary, perform
219e0 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  s incremental me
219f0 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20  rge work..**.** 
21a00 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
21a10 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
21a20 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
21a30 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
21a40 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
21a50 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
21a60 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
21a70 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
21a80 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75 74  oid fts5IndexAut
21a90 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  omerge(.  Fts5In
21aa0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
21ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
21ac0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
21ad0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
21ae0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
21af0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
21b00 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
21b10 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
21b20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20   int nLeaf      
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
21b50 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74  tput leaves just
21b60 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20   written */.){. 
21b70 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
21b80 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e  TE_OK && p->pCon
21b90 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e  fig->nAutomerge>
21ba0 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
21bb0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
21bc0 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
21bd0 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20   u64 nWrite;    
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21bf0 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
21c00 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  of write-counter
21c10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72   */.    int nWor
21c20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
21c30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21c40 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74  of work-quanta t
21c50 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20  o perform */.   
21c60 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20   int nRem;      
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
21c90 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
21ca0 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rite */..    /* 
21cb0 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65  Update the write
21cc0 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20  -counter. While 
21cd0 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57  doing so, set nW
21ce0 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69  ork. */.    nWri
21cf0 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
21d00 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
21d10 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28 28   nWork = (int)((
21d20 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29  (nWrite + nLeaf)
21d30 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
21d40 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e   - (nWrite / p->
21d50 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20 20  nWorkUnit));.   
21d60 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
21d70 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66  Counter += nLeaf
21d80 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69 6e  ;.    nRem = (in
21d90 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20  t)(p->nWorkUnit 
21da0 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63  * nWork * pStruc
21db0 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20 20  t->nLevel);..   
21dc0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
21dd0 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65  p, ppStruct, nRe
21de0 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  m, p->pConfig->n
21df0 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20 7d 0a  Automerge);.  }.
21e00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
21e10 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
21e20 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
21e30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
21e40 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
21e50 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
21e60 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
21e70 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20   **ppStruct     
21e80 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
21e90 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
21ea0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  of index */.){. 
21eb0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73   const int nCris
21ec0 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  is = p->pConfig-
21ed0 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20  >nCrisisMerge;. 
21ee0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
21ef0 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
21f00 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20  uct;.  int iLvl 
21f10 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
21f20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
21f30 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
21f40 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vel>0 );.  while
21f50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
21f60 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
21f70 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
21f80 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20  >=nCrisis ){.   
21f90 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
21fa0 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
21fb0 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20  , iLvl, 0);.    
21fc0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
21fd0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72  QLITE_OK || pStr
21fe0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76  uct->nLevel>(iLv
21ff0 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35  l+1) );.    fts5
22000 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
22010 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72  (p, iLvl+1, pStr
22020 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b  uct);.    iLvl++
22030 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63  ;.  }.  *ppStruc
22040 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a  t = pStruct;.}..
22050 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
22060 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49  ndexReturn(Fts5I
22070 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ndex *p){.  int 
22080 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d  rc = p->rc;.  p-
22090 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
220a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
220b0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
220c0 46 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73  Fts5FlushCtx Fts
220d0 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63  5FlushCtx;.struc
220e0 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b  t Fts5FlushCtx {
220f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
22100 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69  dx;.  Fts5SegWri
22110 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a  ter writer; .};.
22120 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42  ./*.** Buffer aB
22130 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20  uf[] contains a 
22140 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c  list of varints,
22150 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67   all small enoug
22160 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61  h to fit.** in a
22170 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
22180 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
22190 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
221a0 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a  prefix of this .
221b0 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74  ** list nMax byt
221c0 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69  es or less in si
221d0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
221e0 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  t fts5PoslistPre
221f0 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42  fix(const u8 *aB
22200 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20  uf, int nMax){. 
22210 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20   int ret;.  u32 
22220 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66  dummy;.  ret = f
22230 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61  ts5GetVarint32(a
22240 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69  Buf, dummy);.  i
22250 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20  f( ret<nMax ){. 
22260 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
22270 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73       int i = fts
22280 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42  5GetVarint32(&aB
22290 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b  uf[ret], dummy);
222a0 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20  .      if( (ret 
222b0 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72  + i) > nMax ) br
222c0 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b  eak;.      ret +
222d0 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = i;.    }.  }. 
222e0 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
222f0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  /*.** Flush the 
22300 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d  contents of in-m
22310 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
22320 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20   iHash to a new 
22330 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d  level-0 .** segm
22340 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73  ent on disk. Als
22350 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72  o update the cor
22360 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63  responding struc
22370 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
22380 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
22390 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
223a0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
223b0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
223c0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
223d0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
223e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
223f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
22400 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68  c void fts5Flush
22410 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65  OneHash(Fts5Inde
22420 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73  x *p){.  Fts5Has
22430 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48  h *pHash = p->pH
22440 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63  ash;.  Fts5Struc
22450 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
22460 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69   int iSegid;.  i
22470 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61   /* Last leaf pa
224a0 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67  ge number in seg
224b0 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  ment */..  /* Ob
224c0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
224d0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74   to the index st
224e0 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f  ructure and allo
224f0 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
22500 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74  nt-id.  ** for t
22510 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73  he new level-0 s
22520 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53  egment.  */.  pS
22530 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
22540 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
22550 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
22560 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
22570 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
22580 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
22590 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  e(p);..  if( iSe
225a0 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
225b0 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
225c0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20 20  Config->pgsz;.  
225d0 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
225e0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
225f0 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53 74 72  ail;.    Fts5Str
22600 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
22610 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65  Seg;   /* New se
22620 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74  gment within pSt
22630 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35  ruct */.    Fts5
22640 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
22650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
22660 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
22670 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61  assemble leaf pa
22680 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ge */.    Fts5Bu
22690 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20  ffer *pPgidx;   
226a0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
226b0 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
226c0 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a  semble pgidx */.
226d0 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
226e0 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66  er writer;.    f
226f0 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
22700 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
22710 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  ;..    pBuf = &w
22720 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
22730 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20 26  ;.    pPgidx = &
22740 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
22750 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73  idx;..    /* fts
22760 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f  5WriteInit() sho
22770 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c  uld have initial
22780 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72 73  ized the buffers
22790 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79   to (most likely
227a0 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78  ).    ** the max
227b0 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69  imum space requi
227c0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  red. */.    asse
227d0 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75  rt( p->rc || pBu
227e0 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  f->nSpace>=(pgsz
227f0 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
22800 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73  DING) );.    ass
22810 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50  ert( p->rc || pP
22820 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  gidx->nSpace>=(p
22830 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
22840 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20  PADDING) );..   
22850 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69   /* Begin scanni
22860 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20  ng through hash 
22870 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54  table entries. T
22880 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  his loop runs on
22890 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  ce for each.    
228a0 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  ** term/doclist 
228b0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
228c0 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68   within the hash
228d0 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
228e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
228f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
22900 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
22910 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61  HashScanInit(pHa
22920 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  sh, 0, 0);.    }
22930 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
22940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22950 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61  0==sqlite3Fts5Ha
22960 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29  shScanEof(pHash)
22970 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
22980 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
22990 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
229a0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
229b0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
229c0 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
229d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
229e0 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
229f0 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
22a00 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a20 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
22a30 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
22a40 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
22a50 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   term for this e
22a60 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  ntry to disk. */
22a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
22a80 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
22a90 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
22aa0 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c  pDoclist, &nDocl
22ab0 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ist);.      fts5
22ac0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
22ad0 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e 74  p, &writer, (int
22ae0 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20  )strlen(zTerm), 
22af0 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d  (const u8*)zTerm
22b00 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
22b10 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
22b20 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b  owidInPage==0 );
22b30 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e  .      if( pgsz>
22b40 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69  =(pBuf->n + pPgi
22b50 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74  dx->n + nDoclist
22b60 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20   + 1) ){.       
22b70 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
22b80 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oclist will fit 
22b90 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
22ba0 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
22bb0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
22bc0 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
22bd0 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73  Doclist, nDoclis
22be0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
22bf0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f  .        i64 iRo
22c00 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wid = 0;.       
22c10 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
22c20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
22c30 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  f = 0;..        
22c40 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f  /* The entire do
22c50 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  clist will not f
22c60 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
22c70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
22c80 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20          ** loop 
22c90 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
22ca0 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68   the poslists th
22cb0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
22cc0 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  urrent .        
22cd0 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a  ** doclist.  */.
22ce0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
22cf0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22d00 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  && iOff<nDoclist
22d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
22d20 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
22d30 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  int(&pDoclist[iO
22d40 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
22d50 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ta);.          i
22d60 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
22d70 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
22d80 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72        if( writer
22d90 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
22da0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
22db0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
22dc0 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36 29 70  uf->p[0], (u16)p
22dd0 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69  Buf->n);   /* fi
22de0 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
22df0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
22e00 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
22e10 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
22e20 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
22e30 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  n], iRowid);.   
22e40 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e           writer.
22e50 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
22e60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
22e70 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
22e80 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74  xAppend(p, &writ
22e90 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  er, iRowid);.   
22ea0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22eb0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
22ec0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
22ed0 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
22ee0 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65  >p[pBuf->n], iDe
22ef0 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
22f00 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
22f10 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
22f20 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20  f->nSpace );..  
22f30 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 74          if( eDet
22f40 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
22f50 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
22f60 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44       if( iOff<nD
22f70 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69  oclist && pDocli
22f80 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  st[iOff]==0 ){. 
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75               pBu
22fa0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
22fb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
22fc0 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
22fd0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
22fe0 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44  f<nDoclist && pD
22ff0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20  oclist[iOff]==0 
23000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23010 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d     pBuf->p[pBuf-
23020 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  >n++] = 0;.     
23030 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b             iOff+
23040 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
23050 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
23060 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23070 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69   (pBuf->n + pPgi
23080 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a  dx->n)>=pgsz ){.
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
230a0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
230b0 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20  (p, &writer);.  
230c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
230d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
230e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
230f0 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mmy;.           
23100 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
23110 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
23120 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73   = fts5GetPoslis
23130 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b  tSize(&pDoclist[
23140 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
23150 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  Dummy);.        
23160 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f      nCopy += nPo
23170 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s;.            i
23180 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
23190 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29  gidx->n + nCopy)
231a0 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20   <= pgsz ){.    
231b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
231c0 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
231d0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
231e0 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f  current leaf. So
231f0 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20   copy.          
23200 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65      ** it in one
23210 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   go. */.        
23220 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
23230 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
23240 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69  Buf, &pDoclist[i
23250 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Off], nCopy);.  
23260 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
23280 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73  * The entire pos
23290 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69  list will not fi
232a0 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20  t on this leaf. 
232b0 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20  So it needs.    
232c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
232d0 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73  be broken into s
232e0 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ections. The onl
232f0 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20  y qualification 
23300 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  being.          
23310 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68      ** that each
23320 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20   varint must be 
23330 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75  stored contiguou
23340 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  sly.  */.       
23350 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
23360 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f  *pPoslist = &pDo
23370 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20  clist[iOff];.   
23380 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
23390 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
233a0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
233b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
233c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
233d0 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70    int nSpace = p
233e0 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20  gsz - pBuf->n - 
233f0 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20  pPgidx->n;.     
23400 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
23410 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23420 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79        if( (nCopy
23430 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65   - iPos)<=nSpace
23440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23450 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20        n = nCopy 
23460 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  - iPos;.        
23470 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74   n = fts5Poslist
234a0 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74  Prefix(&pPoslist
234b0 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b  [iPos], nSpace);
234c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
234d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
234e0 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29     assert( n>0 )
234f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23500 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
23510 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
23520 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d   &pPoslist[iPos]
23530 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
23540 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b        iPos += n;
23550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23560 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
23570 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a  pPgidx->n)>=pgsz
23580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23590 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
235a0 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
235b0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
235c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
235d0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
235e0 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b  >=nCopy ) break;
235f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23600 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23610 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20             iOff 
23620 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  += nCopy;.      
23630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23640 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
23650 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74  * TODO2: Doclist
23660 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74   terminator writ
23670 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ten here. */.   
23680 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42     /* pBuf->p[pB
23690 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b  uf->n++] = '\0';
236a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
236b0 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
236c0 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
236d0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
236e0 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b  ScanNext(pHash);
236f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23700 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
23710 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35  pHash);.    fts5
23720 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
23730 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73  writer, &pgnoLas
23740 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
23750 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
23760 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
23770 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
23780 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
23790 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
237a0 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
237b0 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
237c0 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
237d0 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
237e0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
237f0 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
23800 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
23810 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
23820 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
23830 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
23840 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
23850 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23860 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
23870 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
23880 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
23890 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
238a0 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
238b0 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
238c0 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
238d0 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
238e0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
238f0 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74  oLast = pgnoLast
23900 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
23910 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20  >nSegment++;.   
23920 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
23930 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30  turePromote(p, 0
23940 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
23950 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  .  fts5IndexAuto
23960 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
23970 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
23980 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
23990 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
239a0 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
239b0 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
239c0 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
239d0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
239e0 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  uct);.}../*.** F
239f0 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74  lush any data st
23a00 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
23a10 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
23a20 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
23a30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
23a40 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68  d fts5IndexFlush
23a50 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
23a60 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69    /* Unless it i
23a70 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74  s empty, flush t
23a80 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
23a90 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70   disk */.  if( p
23aa0 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29  ->nPendingData )
23ab0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
23ac0 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d  >pHash );.    p-
23ad0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
23ae0 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68  0;.    fts5Flush
23af0 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a  OneHash(p);.  }.
23b00 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 53 74  }..static Fts5St
23b10 72 75 63 74 75 72 65 20 2a 66 74 73 35 49 6e 64  ructure *fts5Ind
23b20 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74  exOptimizeStruct
23b30 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
23b40 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  , .  Fts5Structu
23b50 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20  re *pStruct.){. 
23b60 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23b70 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pNew = 0;.  int 
23b80 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
23b90 74 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20  ts5Structure);. 
23ba0 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
23bb0 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
23bc0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69   int i;..  /* Fi
23bd0 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73  gure out if this
23be0 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69   structure requi
23bf0 72 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  res optimization
23c00 2e 20 41 20 73 74 72 75 63 74 75 72 65 20 64 6f  . A structure do
23c10 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75  es.  ** not requ
23c20 69 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ire optimization
23c30 20 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a   if either:.  **
23c40 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73  .  **  + it cons
23c50 69 73 74 73 20 6f 66 20 66 65 77 65 72 20 74 68  ists of fewer th
23c60 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c  an two segments,
23c70 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c   or .  **  + all
23c80 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e   segments are on
23c90 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c   the same level,
23ca0 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20   or.  **  + all 
23cb0 73 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74 20  segments except 
23cc0 6f 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  one are currentl
23cd0 79 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d 65  y inputs to a me
23ce0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  rge operation.. 
23cf0 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20   **.  ** In the 
23d00 66 69 72 73 74 20 63 61 73 65 2c 20 72 65 74 75  first case, retu
23d10 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20  rn NULL. In the 
23d20 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e  second, incremen
23d30 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a  t the ref-count.
23d40 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74    ** on *pStruct
23d50 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 6f   and return a co
23d60 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  py of the pointe
23d70 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  r to it..  */.  
23d80 69 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65 74  if( nSeg<2 ) ret
23d90 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
23da0 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  ; i<pStruct->nLe
23db0 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  vel; i++){.    i
23dc0 6e 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72 75  nt nThis = pStru
23dd0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53  ct->aLevel[i].nS
23de0 65 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68 69  eg;.    if( nThi
23df0 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69  s==nSeg || (nThi
23e00 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53 74  s==nSeg-1 && pSt
23e10 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
23e20 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20 29  nMerge==nThis) )
23e30 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
23e40 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74  ctureRef(pStruct
23e50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23e60 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20  pStruct;.    }. 
23e70 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
23e80 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d  ct->aLevel[i].nM
23e90 65 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20  erge<=nThis );. 
23ea0 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28   }..  nByte += (
23eb0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
23ec0 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  1) * sizeof(Fts5
23ed0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b  StructureLevel);
23ee0 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53  .  pNew = (Fts5S
23ef0 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
23f00 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
23f10 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
23f20 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
23f30 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
23f40 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
23f50 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20   nByte = nSeg * 
23f60 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
23f70 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
23f80 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d    pNew->nLevel =
23f90 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
23fa0 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52  +1;.    pNew->nR
23fb0 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77  ef = 1;.    pNew
23fc0 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
23fd0 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  = pStruct->nWrit
23fe0 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c  eCounter;.    pL
23ff0 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76  vl = &pNew->aLev
24000 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
24010 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61  el];.    pLvl->a
24020 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
24030 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
24040 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
24050 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65  ro(&p->rc, nByte
24060 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  );.    if( pLvl-
24070 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >aSeg ){.      i
24080 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
24090 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74       int iSegOut
240a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49   = 0;.      /* I
240b0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
240c0 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f  ll segments, fro
240d0 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65  m oldest to newe
240e0 73 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a  st. Add them to.
240f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77        ** the new
24100 20 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63   Fts5Level objec
24110 74 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e  t so that pLvl->
24120 61 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f  aSeg[0] is the o
24130 6c 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73  ldest.      ** s
24140 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61  egment in the da
24150 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  ta structure.  *
24160 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  /.      for(iLvl
24170 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
24180 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76  -1; iLvl>=0; iLv
24190 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l--){.        fo
241a0 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
241b0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
241c0 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
241d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  +){.          pL
241e0 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74  vl->aSeg[iSegOut
241f0 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  ] = pStruct->aLe
24200 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
24210 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
24220 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20  iSegOut++;.     
24230 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24240 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e     pNew->nSegmen
24250 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d  t = pLvl->nSeg =
24260 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65   nSeg;.    }else
24270 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24280 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
24290 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
242a0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
242b0 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  pNew;.}..int sql
242c0 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74  ite3Fts5IndexOpt
242d0 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20  imize(Fts5Index 
242e0 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
242f0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
24300 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
24310 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73  pNew = 0;..  ass
24320 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
24330 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49  TE_OK );.  fts5I
24340 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
24350 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
24360 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
24370 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
24380 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20  nvalidate(p);.. 
24390 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
243a0 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49      pNew = fts5I
243b0 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75  ndexOptimizeStru
243c0 63 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  ct(p, pStruct);.
243d0 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74    }.  fts5Struct
243e0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
243f0 63 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ct);..  assert( 
24400 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d  pNew==0 || pNew-
24410 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20  >nSegment>0 );. 
24420 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
24430 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66   int iLvl;.    f
24440 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d  or(iLvl=0; pNew-
24450 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
24460 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d  eg==0; iLvl++){}
24470 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
24480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24490 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pNew->aLevel[iLv
244a0 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20  l].nSeg>0 ){.   
244b0 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54     int nRem = FT
244c0 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54  S5_OPT_WORK_UNIT
244d0 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65  ;.      fts5Inde
244e0 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
244f0 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65  pNew, iLvl, &nRe
24500 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  m);.    }..    f
24510 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
24520 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  e(p, pNew);.    
24530 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
24540 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  ease(pNew);.  }.
24550 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
24560 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d  dexReturn(p); .}
24570 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
24580 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d  called to implem
24590 65 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20  ent the special 
245a0 22 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c  "VALUES('merge',
245b0 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e   $nMerge)".** IN
245c0 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  SERT command..*/
245d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
245e0 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
245f0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
24600 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75  rge){.  Fts5Stru
24610 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
24620 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24630 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
24640 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
24650 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nMin = p->pConfi
24660 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20  g->nUsermerge;. 
24670 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24680 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
24690 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20     if( nMerge<0 
246a0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
246b0 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66  ucture *pNew = f
246c0 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
246d0 53 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63  Struct(p, pStruc
246e0 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74  t);.      fts5St
246f0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
24700 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
24710 53 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20  Struct = pNew;. 
24720 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20       nMin = 2;. 
24730 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d       nMerge = nM
24740 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20  erge*-1;.    }. 
24750 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26     if( pStruct &
24760 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
24770 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  l ){.      if( f
24780 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
24790 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
247a0 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20  e, nMin) ){.    
247b0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
247c0 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
247d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
247e0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
247f0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
24800 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ct);.  }.  retur
24810 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
24820 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(p);.}..static 
24830 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52  void fts5AppendR
24840 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
24850 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c  x *p,.  i64 iDel
24860 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a  ta,.  Fts5Iter *
24870 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42  pUnused,.  Fts5B
24880 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
24890 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
248a0 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75  nused);.  fts5Bu
248b0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
248c0 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69  (&p->rc, pBuf, i
248d0 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69  Delta);.}..stati
248e0 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e  c void fts5Appen
248f0 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  dPoslist(.  Fts5
24900 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20  Index *p,.  i64 
24910 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74  iDelta,.  Fts5It
24920 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74  er *pMulti,.  Ft
24930 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
24940 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20  {.  int nData = 
24950 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61  pMulti->base.nDa
24960 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44  ta;.  assert( nD
24970 61 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ata>0 );.  if( p
24980 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
24990 26 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72  && 0==fts5Buffer
249a0 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75  Grow(&p->rc, pBu
249b0 66 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20 29 7b  f, nData+9+9) ){
249c0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
249d0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
249e0 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20  pBuf, iDelta);. 
249f0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
24a00 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
24a10 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20 20  uf, nData*2);.  
24a20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24a30 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
24a40 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70 44   pMulti->base.pD
24a50 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  ata, nData);.  }
24a60 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
24a70 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
24a80 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74  Next(Fts5Doclist
24a90 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
24aa0 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61  u8 *p = pIter->a
24ab0 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d  Poslist + pIter-
24ac0 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e  >nSize + pIter->
24ad0 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73  nPoslist;..  ass
24ae0 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73  ert( pIter->aPos
24af0 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e  list );.  if( p>
24b00 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a  =pIter->aEof ){.
24b10 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c      pIter->aPosl
24b20 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ist = 0;.  }else
24b30 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
24b40 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35  ;..    p += fts5
24b50 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36  GetVarint(p, (u6
24b60 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
24b70 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
24b80 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f  = iDelta;..    /
24b90 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20  * Read position 
24ba0 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20  list size */.   
24bb0 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30   if( p[0] & 0x80
24bc0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
24bd0 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  os;.      pIter-
24be0 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74  >nSize = fts5Get
24bf0 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73  Varint32(p, nPos
24c00 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
24c10 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73  nPoslist = (nPos
24c20 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >>1);.    }else{
24c30 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
24c40 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28  oslist = ((int)(
24c50 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20  p[0])) >> 1;.   
24c60 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20     pIter->nSize 
24c70 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
24c80 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
24c90 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = p;.  }.}..stat
24ca0 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
24cb0 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46  istIterInit(.  F
24cc0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
24cd0 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49   .  Fts5DoclistI
24ce0 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
24cf0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
24d00 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
24d10 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  ;.  pIter->aPosl
24d20 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20  ist = pBuf->p;. 
24d30 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26   pIter->aEof = &
24d40 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
24d50 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49  ;.  fts5DoclistI
24d60 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
24d70 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41  }..#if 0./*.** A
24d80 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20  ppend a doclist 
24d90 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  to buffer pBuf..
24da0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24db0 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
24dc0 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68   space within th
24dd0 65 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72  e buffer has alr
24de0 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c  eady been.** all
24df0 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ocated..*/.stati
24e00 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
24e10 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46  AppendDocid(.  F
24e20 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e40 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74  * Buffer to writ
24e50 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70  e to */.  i64 *p
24e60 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20  iLastRowid,     
24e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
24e80 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f  OUT: Previous ro
24e90 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20  wid written (if 
24ea0 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52  any) */.  i64 iR
24eb0 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
24ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
24ed0 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  id to append */.
24ee0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  ){.  assert( pBu
24ef0 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c  f->n!=0 || (*piL
24f00 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a  astRowid)==0 );.
24f10 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24f20 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
24f30 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c  f, iRowid - *piL
24f40 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69  astRowid);.  *pi
24f50 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
24f60 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  id;.}.#endif..#d
24f70 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41  efine fts5MergeA
24f80 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c  ppendDocid(pBuf,
24f90 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f   iLastRowid, iRo
24fa0 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20  wid) {       \. 
24fb0 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
24fc0 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52  >n!=0 || (iLastR
24fd0 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20  owid)==0 );     
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
24ff0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
25000 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42  AppendVarint((pB
25010 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20  uf), (iRowid) - 
25020 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c  (iLastRowid)); \
25030 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20  .  (iLastRowid) 
25040 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20  = (iRowid);     
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25070 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  \.}../*.** Swap 
25080 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25090 62 75 66 66 65 72 20 2a 70 31 20 77 69 74 68 20  buffer *p1 with 
250a0 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a  that of *p2..*/.
250b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
250c0 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42  BufferSwap(Fts5B
250d0 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42  uffer *p1, Fts5B
250e0 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74  uffer *p2){.  Ft
250f0 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a  s5Buffer tmp = *
25100 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b  p1;.  *p1 = *p2;
25110 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a  .  *p2 = tmp;.}.
25120 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
25130 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35 42  5NextRowid(Fts5B
25140 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e 74  uffer *pBuf, int
25150 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70 69   *piOff, i64 *pi
25160 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69 20  Rowid){.  int i 
25170 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28 20  = *piOff;.  if( 
25180 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20  i>=pBuf->n ){.  
25190 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20    *piOff = -1;. 
251a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34 20   }else{.    u64 
251b0 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66  iVal;.    *piOff
251c0 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46 74   = i + sqlite3Ft
251d0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
251e0 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b  f->p[i], &iVal);
251f0 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d  .    *piRowid +=
25200 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iVal;.  }.}../*
25210 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
25220 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66 74  equivalent of ft
25230 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
25240 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 3d  ts() for detail=
25250 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e  none mode..** In
25260 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 62   this case the b
25270 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20 6f  uffers consist o
25280 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65  f a delta-encode
25290 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64 73  d list of rowids
252a0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
252b0 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 52   void fts5MergeR
252c0 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74 73  owidLists(.  Fts
252d0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252f0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
25300 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
25310 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
25320 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25330 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
25340 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
25350 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
25360 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
25370 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
25380 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30 3b  ){.  int i1 = 0;
25390 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20  .  int i2 = 0;. 
253a0 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20 30   i64 iRowid1 = 0
253b0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32 20  ;.  i64 iRowid2 
253c0 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74 20  = 0;.  i64 iOut 
253d0 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66 66  = 0;..  Fts5Buff
253e0 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74  er out;.  memset
253f0 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (&out, 0, sizeof
25400 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74 65  (out));.  sqlite
25410 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
25420 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31  &p->rc, &out, p1
25430 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20  ->n + p2->n);.  
25440 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
25450 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74 52  rn;..  fts5NextR
25460 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69  owid(p1, &i1, &i
25470 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35 4e  Rowid1);.  fts5N
25480 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32  extRowid(p2, &i2
25490 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 77  , &iRowid2);.  w
254a0 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69  hile( i1>=0 || i
254b0 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  2>=0 ){.    if( 
254c0 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20 7c  i1>=0 && (i2<0 |
254d0 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69 64  | iRowid1<iRowid
254e0 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  2) ){.      asse
254f0 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69  rt( iOut==0 || i
25500 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20  Rowid1>iOut );. 
25510 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
25520 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
25530 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d 20  &out, iRowid1 - 
25540 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75  iOut);.      iOu
25550 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20 20  t = iRowid1;.   
25560 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64     fts5NextRowid
25570 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69  (p1, &i1, &iRowi
25580 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  d1);.    }else{.
25590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
255a0 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32  ut==0 || iRowid2
255b0 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66  >iOut );.      f
255c0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
255d0 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20  endVarint(&out, 
255e0 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29 3b  iRowid2 - iOut);
255f0 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52  .      iOut = iR
25600 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66 28  owid2;.      if(
25610 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69 64   i1>=0 && iRowid
25620 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20 20  1==iRowid2 ){.  
25630 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
25640 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
25650 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a  owid1);.      }.
25660 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
25670 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52  wid(p2, &i2, &iR
25680 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20  owid2);.    }.  
25690 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  }..  fts5BufferS
256a0 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20  wap(&out, p1);. 
256b0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
256c0 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &out);.}../*.** 
256d0 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70  Buffers p1 and p
256e0 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73  2 contain doclis
256f0 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
25700 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e  n merges the con
25710 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74  tent.** of the t
25720 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65  wo doclists toge
25730 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75  ther and sets bu
25740 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72  ffer p1 to the r
25750 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20  esult before.** 
25760 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
25770 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25780 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
25790 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
257a0 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  >rc. If an error
257b0 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
257c0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
257d0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
257e0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
257f0 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  id fts5MergePref
25800 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49  ixLists(.  Fts5I
25810 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
25820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
25830 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
25840 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
25850 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20  r *p1,          
25860 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25870 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
25880 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
25890 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
258a0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73     /* Second lis
258b0 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b  t to merge */.){
258c0 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a  .  if( p2->n ){.
258d0 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
258e0 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  id = 0;.    Fts5
258f0 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a  DoclistIter i1;.
25900 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
25910 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35  ter i2;.    Fts5
25920 42 75 66 66 65 72 20 6f 75 74 20 3d 20 7b 30 2c  Buffer out = {0,
25930 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74 73 35   0, 0};.    Fts5
25940 42 75 66 66 65 72 20 74 6d 70 20 3d 20 7b 30 2c  Buffer tmp = {0,
25950 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 2f 2a 20   0, 0};..    /* 
25960 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  The maximum size
25970 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   of the output i
25980 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  s equal to the s
25990 75 6d 20 6f 66 20 74 68 65 20 74 77 6f 20 0a 20  um of the two . 
259a0 20 20 20 2a 2a 20 69 6e 70 75 74 20 73 69 7a 65     ** input size
259b0 73 20 2b 20 31 20 76 61 72 69 6e 74 20 28 39 20  s + 1 varint (9 
259c0 62 79 74 65 73 29 2e 20 54 68 65 20 65 78 74 72  bytes). The extr
259d0 61 20 76 61 72 69 6e 74 20 69 73 20 62 65 63 61  a varint is beca
259e0 75 73 65 20 69 66 20 74 68 65 0a 20 20 20 20 2a  use if the.    *
259f0 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  * first rowid in
25a00 20 6f 6e 65 20 69 6e 70 75 74 20 69 73 20 61 20   one input is a 
25a10 6c 61 72 67 65 20 6e 65 67 61 74 69 76 65 20 6e  large negative n
25a20 75 6d 62 65 72 2c 20 61 6e 64 20 74 68 65 20 66  umber, and the f
25a30 69 72 73 74 20 69 6e 0a 20 20 20 20 2a 2a 20 74  irst in.    ** t
25a40 68 65 20 6f 74 68 65 72 20 61 20 6e 6f 6e 2d 6e  he other a non-n
25a50 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20  egative number, 
25a60 74 68 65 20 64 65 6c 74 61 20 66 6f 72 20 74 68  the delta for th
25a70 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 20  e non-negative. 
25a80 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 77 69 6c     ** number wil
25a90 6c 20 62 65 20 6c 61 72 67 65 72 20 6f 6e 20 64  l be larger on d
25aa0 69 73 6b 20 74 68 61 6e 20 74 68 65 20 6c 69 74  isk than the lit
25ab0 65 72 61 6c 20 69 6e 74 65 67 65 72 20 76 61 6c  eral integer val
25ac0 75 65 0a 20 20 20 20 2a 2a 20 77 61 73 2e 20 20  ue.    ** was.  
25ad0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
25ae0 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
25af0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
25b00 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20 2b 20 39  1->n + p2->n + 9
25b10 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
25b20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
25b30 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20 20  nit(p1, &i1);.  
25b40 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25b50 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b 0a  rInit(p2, &i2);.
25b60 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
25b70 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e 69 52  .      if( i1.iR
25b80 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 20 29  owid<i2.iRowid )
25b90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
25ba0 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20  y entry from i1 
25bb0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
25bc0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
25bd0 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
25be0 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
25bf0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
25c00 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
25c10 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  out, i1.aPoslist
25c20 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31  , i1.nPoslist+i1
25c30 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  .nSize);.       
25c40 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
25c50 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
25c60 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69     if( i1.aPosli
25c70 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  st==0 ) break;. 
25c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
25c90 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64 21  e if( i2.iRowid!
25ca0 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  =i1.iRowid ){.  
25cb0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
25cc0 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20  try from i2 */. 
25cd0 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
25ce0 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
25cf0 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32  , iLastRowid, i2
25d00 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
25d10 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
25d20 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
25d30 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32   i2.aPoslist, i2
25d40 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69  .nPoslist+i2.nSi
25d50 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ze);.        fts
25d60 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
25d70 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 69  (&i2);.        i
25d80 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
25d90 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
25da0 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20   }.      else{. 
25db0 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20         /* Merge 
25dc0 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e  the two position
25dd0 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20   lists. */ .    
25de0 20 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d 20      i64 iPos1 = 
25df0 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
25e00 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos2 = 0;.      
25e10 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b    int iOff1 = 0;
25e20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
25e30 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f2 = 0;.        
25e40 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f  u8 *a1 = &i1.aPo
25e50 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b  slist[i1.nSize];
25e60 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32 20  .        u8 *a2 
25e70 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69  = &i2.aPoslist[i
25e80 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20 20  2.nSize];..     
25e90 20 20 20 69 36 34 20 69 50 72 65 76 20 3d 20 30     i64 iPrev = 0
25ea0 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ;.        Fts5Po
25eb0 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74  slistWriter writ
25ec0 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  er;.        mems
25ed0 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
25ee0 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a  izeof(writer));.
25ef0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
25f00 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
25f10 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
25f20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
25f30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
25f40 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20  ro(&tmp);.      
25f50 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
25f60 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
25f70 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  &tmp, i1.nPoslis
25f80 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29  t + i2.nPoslist)
25f90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
25fa0 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
25fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
25fc0 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
25fd0 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
25fe0 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
25ff0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26000 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
26010 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
26020 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
26030 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
26040 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20  rt( iPos1>=0 && 
26050 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20 20  iPos2>=0 );..   
26060 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69       if( iPos1<i
26070 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos2 ){.        
26080 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
26090 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
260a0 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
260b0 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  s1);.          s
260c0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
260d0 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
260e0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
260f0 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
26100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26110 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26120 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
26130 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
26140 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
26150 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26160 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e  stNext64(a2, i2.
26170 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32  nPoslist, &iOff2
26180 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  , &iPos2);.     
26190 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
261a0 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50  ( iPos1>=0 && iP
261b0 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  os2>=0 ){.      
261c0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
261d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
261e0 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20  iPos1<iPos2 ){. 
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26200 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b   iPos1!=iPrev ){
26210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26220 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26230 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74  istSafeAppend(&t
26240 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73  mp, &iPrev, iPos
26250 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
26260 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26270 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
26280 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
26290 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
262a0 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
262b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
262c0 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b 3b 0a  Pos1<0 ) break;.
262d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
262e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
262f0 20 61 73 73 65 72 74 28 20 69 50 6f 73 32 21 3d   assert( iPos2!=
26300 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20  iPrev );.       
26310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26320 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70  s5PoslistSafeApp
26330 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76  end(&tmp, &iPrev
26340 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20  , iPos2);.      
26350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
26360 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
26370 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
26380 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
26390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
263a0 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20 62   if( iPos2<0 ) b
263b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
263c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
263d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
263e0 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20     if( iPos1>=0 
263f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26400 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b   iPos1!=iPrev ){
26410 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26420 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
26430 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
26440 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
26450 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26460 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26470 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
26480 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31 5d 2c  tmp, &a1[iOff1],
26490 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f 66   i1.nPoslist-iOf
264a0 66 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  f1);.        }el
264b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
264c0 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30 20 26  sert( iPos2>=0 &
264d0 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29  & iPos2!=iPrev )
264e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
264f0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
26500 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
26510 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20  iPrev, iPos2);. 
26520 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
26530 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26540 62 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f 66 66  b(&tmp, &a2[iOff
26550 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2d  2], i2.nPoslist-
26560 69 4f 66 66 32 29 3b 0a 20 20 20 20 20 20 20 20  iOff2);.        
26570 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52  }..        /* WR
26580 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
26590 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
265a0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
265b0 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e  rint(&out, tmp.n
265c0 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66   * 2);.        f
265d0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
265e0 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d  endBlob(&out, tm
265f0 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20  p.p, tmp.n);.   
26600 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
26610 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20  IterNext(&i1);. 
26620 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
26630 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b  stIterNext(&i2);
26640 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31 2e  .        if( i1.
26650 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69  aPoslist==0 || i
26660 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  2.aPoslist==0 ) 
26670 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26680 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 31     }..    if( i1
26690 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20  .aPoslist ){.   
266a0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
266b0 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
266c0 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
266d0 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  wid);.      fts5
266e0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
266f0 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61 50  Blob(&out, i1.aP
26700 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66 20  oslist, i1.aEof 
26710 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  - i1.aPoslist);.
26720 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
26730 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20 29  f( i2.aPoslist )
26740 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67  {.      fts5Merg
26750 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
26760 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
26770 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
26780 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
26790 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
267a0 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.aPoslist, i2.
267b0 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c 69  aEof - i2.aPosli
267c0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  st);.    }.    a
267d0 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28 70  ssert( out.n<=(p
267e0 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29 3b  1->n+p2->n+9) );
267f0 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
26800 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20  Set(&p->rc, p1, 
26810 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20  out.n, out.p);. 
26820 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
26830 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73  e(&tmp);.    fts
26840 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74  5BufferFree(&out
26850 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
26860 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70 50   void fts5SetupP
26870 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74 73  refixIter(.  Fts
26880 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
268a0 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66 72  Index to read fr
268b0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  om */.  int bDes
268c0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
268d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
268e0 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f  for "ORDER BY ro
268f0 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63  wid DESC" */.  c
26900 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c  onst u8 *pToken,
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26920 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
26930 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61  ing prefix to ma
26940 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  tch */.  int nTo
26950 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
26960 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26970 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65   of buffer pToke
26980 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
26990 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
269a0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
269b0 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63  /* Restrict matc
269c0 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c  hes to these col
269d0 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 74  umns */.  Fts5It
269e0 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
269f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
26a00 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   iterator */.){.
26a10 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
26a20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
26a30 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20  Buffer *aBuf;.  
26a40 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d  const int nBuf =
26a50 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   32;..  void (*x
26a60 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65 78  Merge)(Fts5Index
26a70 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
26a80 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20  Fts5Buffer*);.  
26a90 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64 29 28  void (*xAppend)(
26aa0 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c  Fts5Index*, i64,
26ab0 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35   Fts5Iter*, Fts5
26ac0 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28 20  Buffer*);.  if( 
26ad0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
26ae0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
26af0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d 65  _NONE ){.    xMe
26b00 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 52  rge = fts5MergeR
26b10 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20 78  owidLists;.    x
26b20 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70  Append = fts5App
26b30 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73  endRowid;.  }els
26b40 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20  e{.    xMerge = 
26b50 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
26b60 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e  ists;.    xAppen
26b70 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50 6f  d = fts5AppendPo
26b80 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 42  slist;.  }..  aB
26b90 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72  uf = (Fts5Buffer
26ba0 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
26bb0 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  p, sizeof(Fts5Bu
26bc0 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70  ffer)*nBuf);.  p
26bd0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
26be0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
26bf0 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53    if( aBuf && pS
26c00 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e  truct ){.    con
26c10 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
26c20 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
26c30 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20  CAN .           
26c40 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35 49           | FTS5I
26c50 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45  NDEX_QUERY_SKIPE
26c60 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20 20 20  MPTY .          
26c70 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35            | FTS5
26c80 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55  INDEX_QUERY_NOOU
26c90 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20 69 3b  TPUT;.    int i;
26ca0 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
26cb0 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
26cc0 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20  5Iter *p1 = 0;  
26cd0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
26ce0 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64 61  sed to gather da
26cf0 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f  ta from index */
26d00 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
26d10 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42 75  Data;.    Fts5Bu
26d20 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20 20  ffer doclist;.  
26d30 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
26d40 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   1;..    memset(
26d50 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a  &doclist, 0, siz
26d60 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20  eof(doclist));. 
26d70 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
26d80 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
26d90 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c 20  flags, pColset, 
26da0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
26db0 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20  -1, 0, &p1);.   
26dc0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
26dd0 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 31 29  utCb(&p->rc, p1)
26de0 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e 6f  ;.    for( /* no
26df0 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20 20  -op */ ;.       
26e00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
26e10 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
26e20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
26e30 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20 26  erNext2(p, p1, &
26e40 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29 7b  bNewTerm).    ){
26e50 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
26e60 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31 2d 3e  er *pSeg = &p1->
26e70 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72 73 74  aSeg[ p1->aFirst
26e80 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
26e90 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20      int nTerm = 
26ea0 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20  pSeg->term.n;.  
26eb0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
26ec0 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d  erm = pSeg->term
26ed0 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78 53  .p;.      p1->xS
26ee0 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20 70 53  etOutputs(p1, pS
26ef0 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  eg);..      asse
26f00 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54  rt_nc( memcmp(pT
26f10 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e  oken, pTerm, MIN
26f20 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29  (nToken, nTerm))
26f30 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  <=0 );.      if(
26f40 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20   bNewTerm ){.   
26f50 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e       if( nTerm<n
26f60 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  Token || memcmp(
26f70 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e  pToken, pTerm, n
26f80 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a  Token) ) break;.
26f90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
26fa0 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61 74  f( p1->base.nDat
26fb0 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  a==0 ) continue;
26fc0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e  ..      if( p1->
26fd0 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c 61  base.iRowid<=iLa
26fe0 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63 6c 69  stRowid && docli
26ff0 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  st.n>0 ){.      
27000 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
27010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
27020 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a  oclist.n; i++){.
27030 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27040 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20  ( i<nBuf );.    
27050 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69        if( aBuf[i
27060 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ].n==0 ){.      
27070 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27080 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26  Swap(&doclist, &
27090 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
270a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
270b0 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a  Zero(&doclist);.
270c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
270d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 4d 65  .            xMe
270e0 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  rge(p, &doclist,
270f0 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
27100 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
27110 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29  erZero(&aBuf[i])
27120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27140 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
27150 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 78        }..      x
27160 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62 61  Append(p, p1->ba
27170 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74 52  se.iRowid-iLastR
27180 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c 69  owid, p1, &docli
27190 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61 73 74  st);.      iLast
271a0 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61 73 65  Rowid = p1->base
271b0 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a  .iRowid;.    }..
271c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
271d0 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Buf; i++){.     
271e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
271f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27200 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c   xMerge(p, &docl
27210 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
27220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
27230 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42  s5BufferFree(&aB
27240 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  uf[i]);.    }.  
27250 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
27260 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20 70 44  ree(p1);..    pD
27270 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  ata = fts5IdxMal
27280 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
27290 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73  s5Data) + doclis
272a0 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44  t.n);.    if( pD
272b0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ata ){.      pDa
272c0 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44  ta->p = (u8*)&pD
272d0 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44  ata[1];.      pD
272e0 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d  ata->nn = pData-
272f0 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73  >szLeaf = doclis
27300 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t.n;.      if( d
27310 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d 63 70  oclist.n ) memcp
27320 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c  y(pData->p, docl
27330 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e  ist.p, doclist.n
27340 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
27350 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44  tiIterNew2(p, pD
27360 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74  ata, bDesc, ppIt
27370 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
27380 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64  ts5BufferFree(&d
27390 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  oclist);.  }..  
273a0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
273b0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
273c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
273d0 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  uf);.}.../*.** I
273e0 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
273f0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
27400 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
27410 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
27420 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
27430 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
27440 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  id iRowid..*/.in
27450 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27460 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
27470 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
27480 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77  Delete, i64 iRow
27490 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
274a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
274b0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
274c0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
274d0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
274e0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
274f0 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
27500 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
27510 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
27520 33 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e  3Fts5HashNew(p->
27530 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61  pConfig, &p->pHa
27540 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67  sh, &p->nPending
27550 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Data);.  }..  /*
27560 20 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20   Flush the hash 
27570 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66  table to disk if
27580 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
27590 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72  f( iRowid<p->iWr
275a0 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20  iteRowid .   || 
275b0 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69  (iRowid==p->iWri
275c0 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44  teRowid && p->bD
275d0 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  elete==0).   || 
275e0 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
275f0 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   > p->pConfig->n
27600 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a  HashSize) .  ){.
27610 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
27620 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d  sh(p);.  }..  p-
27630 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
27640 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c  Rowid;.  p->bDel
27650 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20  ete = bDelete;. 
27660 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27670 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
27680 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61  *.** Commit data
27690 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
276a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
276b0 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
276c0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
276d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
276e0 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  );.  fts5IndexFl
276f0 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35 43 6c  ush(p);.  fts5Cl
27700 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27710 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
27720 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
27730 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
27740 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
27750 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
27760 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
27770 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
27780 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
27790 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
277a0 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
277b0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
277c0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
277d0 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
277e0 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
277f0 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
27800 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
27810 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
27820 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
27830 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27840 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
27850 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
27860 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27870 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
27880 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53  Data(p);.  fts5S
27890 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
278a0 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65  te(p);.  /* asse
278b0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
278c0 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74  E_OK ); */.  ret
278d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
278e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  ../*.** The %_da
278f0 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  ta table is comp
27900 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65  letely empty whe
27910 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27920 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a  is called. This.
27930 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75  ** function popu
27940 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68  lates it with th
27950 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74  e initial struct
27960 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ure objects for 
27970 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61  each index,.** a
27980 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  nd the initial v
27990 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61  ersion of the "a
279a0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
279b0 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f  (a zero-byte blo
279c0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
279d0 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
279e0 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
279f0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
27a00 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74   s;.  fts5Struct
27a10 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
27a20 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
27a30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
27a40 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
27a50 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
27a60 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
27a70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
27a80 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
27a90 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
27aa0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
27ab0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
27ac0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
27ad0 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
27ae0 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
27af0 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
27b00 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
27b10 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
27b20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
27b30 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
27b40 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
27b50 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
27b60 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
27b70 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
27b80 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
27b90 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
27ba0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
27bb0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
27bc0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
27bd0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27be0 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
27bf0 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
27c00 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
27c10 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
27c20 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
27c30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27c40 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
27c50 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
27c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
27c70 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
27c80 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
27c90 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
27ca0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
27cb0 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
27cc0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
27ce0 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
27cf0 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
27d00 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
27d10 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44  _UNIT;.    p->zD
27d20 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
27d30 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
27d40 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
27d50 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
27d60 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
27d70 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
27d80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27d90 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
27da0 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
27db0 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
27dc0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
27dd0 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
27de0 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
27df0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
27e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27e20 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
27e30 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64  ble(pConfig, "id
27e40 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  x", .           
27e50 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70   "segid, term, p
27e60 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  gno, PRIMARY KEY
27e70 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20  (segid, term)", 
27e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  .            1, 
27e90 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b  pzErr.        );
27ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27eb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27ed0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27ee0 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20  xReinit(p);.    
27ef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27f00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
27f10 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
27f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27f30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
27f40 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
27f50 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20  ose(p);.    *pp 
27f60 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
27f70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
27f80 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
27f90 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
27fa0 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
27fb0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
27fc0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
27fd0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
27fe0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
27ff0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28000 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
28010 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
28020 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
28030 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
28040 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20  validate(p);.   
28050 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28060 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  e(p->pWriter);. 
28070 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
28080 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
28090 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
280a0 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72  nalize(p->pIdxWr
280b0 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
280c0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
280d0 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
280e0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
280f0 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  e(p->pIdxSelect)
28100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28110 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56  nalize(p->pDataV
28120 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  ersion);.    sql
28130 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
28140 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
28150 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
28160 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
28170 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
28180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
281a0 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
281b0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
281c0 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
281d0 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
281e0 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
281f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
28200 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
28210 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
28220 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
28230 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
28240 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
28250 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
28260 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
28270 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
28280 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
28290 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  elen(.  const ch
282a0 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42  ar *p, .  int nB
282b0 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61  yte, .  int nCha
282c0 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  r.){.  int n = 0
282d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
282e0 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
282f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  ++){.    if( n>=
28300 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30  nByte ) return 0
28310 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
28320 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
28330 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20  han nChar chars 
28340 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  */.    if( (unsi
28350 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d  gned char)p[n++]
28360 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
28370 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30  while( (p[n] & 0
28380 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20  xc0)==0x80 ){.  
28390 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
283a0 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20     if( n>=nByte 
283b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
283c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
283d0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
283e0 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65  pIn is a UTF-8 e
283f0 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e  ncoded string, n
28400 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  In bytes in size
28410 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
28420 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64  ber of.** unicod
28430 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
28440 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  the string..*/.s
28450 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
28460 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74  dexCharlen(const
28470 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
28480 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  nIn){.  int nCha
28490 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
284a0 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a    .  int i = 0;.
284b0 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29    while( i<nIn )
284c0 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  {.    if( (unsig
284d0 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b  ned char)pIn[i++
284e0 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
284f0 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26   while( i<nIn &&
28500 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29   (pIn[i] & 0xc0)
28510 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  ==0x80 ) i++;.  
28520 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b    }.    nChar++;
28530 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
28540 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  har;.}../*.** In
28550 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64  sert or remove d
28560 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ata to or from t
28570 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74  he index. Each t
28580 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ime a document i
28590 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f  s .** added to o
285a0 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
285b0 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66  he index, this f
285c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
285d0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  d one or more.**
285e0 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   times..**.** Fo
285f0 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20  r an insert, it 
28600 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f  must be called o
28610 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  nce for each tok
28620 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f  en in the new do
28630 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68  cument..** If th
28640 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
28650 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74   delete, it must
28660 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c   be called (at l
28670 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65  east) once for e
28680 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f  ach.** unique to
28690 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ken in the docum
286a0 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c  ent with an iCol
286b0 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
286c0 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a   zero. The iPos.
286d0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
286e0 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
286f0 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ete..*/.int sqli
28700 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
28710 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
28720 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
28730 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
28740 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
28750 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28770 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
28780 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
28790 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
287a0 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287c0 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
287d0 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
287e0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
287f0 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
28800 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
28810 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
28820 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
28830 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
28860 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
28870 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
28880 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28890 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
288a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
288b0 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
288c0 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
288d0 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72  Config;..  asser
288e0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
288f0 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
28900 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44   (iCol<0)==p->bD
28910 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
28920 64 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  dd the entry to 
28930 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69  the main terms i
28940 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ndex. */.  rc = 
28950 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
28960 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70  rite(.      p->p
28970 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52  Hash, p->iWriteR
28980 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
28990 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  , FTS5_MAIN_PREF
289a0 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  IX, pToken, nTok
289b0 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69  en.  );..  for(i
289c0 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
289d0 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51  Prefix && rc==SQ
289e0 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
289f0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68     const int nCh
28a00 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50  ar = pConfig->aP
28a10 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e  refix[i];.    in
28a20 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
28a30 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
28a40 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
28a50 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72  n, nToken, nChar
28a60 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
28a70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
28a80 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
28a90 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20  ite(p->pHash, . 
28aa0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69           p->iWri
28ab0 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
28ac0 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53 35  Pos, (char)(FTS5
28ad0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31  _MAIN_PREFIX+i+1
28ae0 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20  ), pToken,.     
28af0 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20       nByte.     
28b00 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
28b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28b20 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
28b30 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
28b40 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72  ate though all r
28b50 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68 20  owid that match 
28b60 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  the .** specifie
28b70 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e  d token or token
28b80 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20   prefix..*/.int 
28b90 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28ba0 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64  Query(.  Fts5Ind
28bb0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
28bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
28bd0 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a  index to query *
28be0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28bf0 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
28c00 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72  en, /* Token (or
28c10 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72   prefix) to quer
28c20 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66  y for */.  int f
28c30 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
28c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
28c50 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
28c60 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f  QUERY_X flags */
28c70 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
28c80 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
28c90 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73     /* Match thes
28ca0 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a  e columns only *
28cb0 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
28cc0 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
28cd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
28ce0 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
28cf0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
28d00 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
28d10 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35  >pConfig;.  Fts5
28d20 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Iter *pRet = 0;.
28d30 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
28d40 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
28d50 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   /* If the QUERY
28d60 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65  _SCAN flag is se
28d70 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  t, all other fla
28d80 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  gs must be clear
28d90 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
28da0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
28db0 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30  X_QUERY_SCAN)==0
28dc0 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49   || flags==FTS5I
28dd0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
28de0 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
28df0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
28e00 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54  &p->rc, &buf, nT
28e10 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20  oken+1)==0 ){.  
28e20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20    int iIdx = 0; 
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
28e50 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  ch */.    if( nT
28e60 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28 26 62  oken ) memcpy(&b
28e70 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c  uf.p[1], pToken,
28e80 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f   nToken);..    /
28e90 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
28ea0 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72  ch index to sear
28eb0 63 68 20 61 6e 64 20 73 65 74 20 69 49 64 78 20  ch and set iIdx 
28ec0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
28ed0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61  this.    ** is a
28ee0 20 70 72 65 66 69 78 20 71 75 65 72 79 20 66 6f   prefix query fo
28ef0 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
28f00 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78   no prefix index
28f10 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20  , set iIdx to.  
28f20 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
28f30 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  n pConfig->nPref
28f40 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ix to indicate t
28f50 68 61 74 20 74 68 65 20 71 75 65 72 79 20 77 69  hat the query wi
28f60 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74  ll be.    ** sat
28f70 69 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69  isfied by scanni
28f80 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  ng multiple term
28f90 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
28fa0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
28fb0 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  ** If the QUERY_
28fc0 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20  TEST_NOIDX flag 
28fd0 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
28fe0 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65  hen this must be
28ff0 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78   a.    ** prefix
29000 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20  -query. Instead 
29010 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66 69  of using a prefi
29020 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20  x-index (if one 
29030 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a  exists), .    **
29040 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70 72   evaluate the pr
29050 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e 67  efix query using
29060 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e   the main FTS in
29070 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73 65  dex. This is use
29080 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74  d.    ** for int
29090 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ernal sanity che
290a0 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74  cking by the int
290b0 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20  egrity-check in 
290c0 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f  debug .    ** mo
290d0 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66  de only.  */.#if
290e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
290f0 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
29100 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d  ->bPrefixIndex==
29110 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
29120 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
29130 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20  ST_NOIDX) ){.   
29140 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
29150 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
29160 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20  RY_PREFIX );.   
29170 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
29180 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
29190 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
291a0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
291b0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
291c0 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69  REFIX ){.      i
291d0 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
291e0 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
291f0 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
29200 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
29210 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
29220 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
29230 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
29240 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
29250 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
29260 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29270 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78   }..    if( iIdx
29280 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
29290 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ix ){.      /* S
292a0 74 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f  traight index lo
292b0 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74  okup */.      Ft
292c0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
292d0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
292e0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20  tureRead(p);.   
292f0 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75     buf.p[0] = (u
29300 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  8)(FTS5_MAIN_PRE
29310 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20  FIX + iIdx);.   
29320 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
29330 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
29340 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
29350 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46  truct, flags | F
29360 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
29370 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20  KIPEMPTY, .     
29380 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20         pColset, 
29390 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c  buf.p, nToken+1,
293a0 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20   -1, 0, &pRet.  
293b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
293c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
293d0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
293e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
293f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  e{.      /* Scan
29400 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
29410 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  in the main inde
29420 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  x */.      int b
29430 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  Desc = (flags & 
29440 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
29450 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  DESC)!=0;.      
29460 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
29470 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20  MAIN_PREFIX;.   
29480 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
29490 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
294a0 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
294b0 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74  , pColset, &pRet
294c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
294d0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
294e0 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73  K || pRet->pCols
294f0 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  et==0 );.      f
29500 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
29510 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29  Cb(&p->rc, pRet)
29520 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
29530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29540 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
29550 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65  ter *pSeg = &pRe
29560 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46  t->aSeg[pRet->aF
29570 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
29580 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
29590 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d  g->pLeaf ) pRet-
295a0 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 52 65  >xSetOutputs(pRe
295b0 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  t, pSeg);.      
295c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
295d0 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
295e0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
295f0 6c 6f 73 65 28 28 46 74 73 35 49 6e 64 65 78 49  lose((Fts5IndexI
29600 74 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  ter*)pRet);.    
29610 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
29620 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
29630 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r(p);.    }..   
29640 20 2a 70 70 49 74 65 72 20 3d 20 28 46 74 73 35   *ppIter = (Fts5
29650 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74 3b  IndexIter*)pRet;
29660 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
29670 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
29680 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
29690 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
296a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
296b0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
296c0 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
296d0 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
296e0 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
296f0 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  /./*.** Move to 
29700 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
29710 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74  g rowid. .*/.int
29720 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29730 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74  Next(Fts5IndexIt
29740 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
29750 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
29760 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
29770 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73  pIndexIter;.  as
29780 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
29790 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
297a0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74  OK );.  fts5Mult
297b0 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d  iIterNext(pIter-
297c0 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
297d0 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
297e0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
297f0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
29800 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
29810 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
29820 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55  ng term/rowid. U
29830 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76  sed by the fts5v
29840 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  ocab module..*/.
29850 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
29860 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35  terNextScan(Fts5
29870 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
29880 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74  xIter){.  Fts5It
29890 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
298a0 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
298b0 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r;.  Fts5Index *
298c0 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
298d0 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  x;..  assert( pI
298e0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
298f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
29900 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
29910 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
29920 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0);.  if( p->rc=
29930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29940 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
29950 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
29960 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
29970 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
29980 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
29990 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d  af && pSeg->term
299a0 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e  .p[0]!=FTS5_MAIN
299b0 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
299c0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
299d0 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20  (pSeg->pLeaf);. 
299e0 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66       pSeg->pLeaf
299f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
29a00 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31  r->base.bEof = 1
29a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
29a20 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
29a30 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
29a40 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
29a50 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
29a60 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
29a70 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
29a80 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
29a90 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
29aa0 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
29ab0 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
29ac0 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
29ad0 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
29ae0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
29af0 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
29b00 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  order..*/.int sq
29b10 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
29b20 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
29b30 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c  ter *pIndexIter,
29b40 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
29b50 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
29b60 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
29b70 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d  dexIter;.  fts5M
29b80 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
29b90 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
29ba0 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a  pIter, iMatch);.
29bb0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
29bc0 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
29bd0 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
29be0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
29bf0 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f  rent term..*/.co
29c00 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
29c10 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74  3Fts5IterTerm(Ft
29c20 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
29c30 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e  dexIter, int *pn
29c40 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  ){.  int n;.  co
29c50 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
29c60 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d  onst char*)fts5M
29c70 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46 74  ultiIterTerm((Ft
29c80 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
29c90 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d  er, &n);.  *pn =
29ca0 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26   n-1;.  return &
29cb0 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  z[1];.}../*.** C
29cc0 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lose an iterator
29cd0 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
29ce0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
29cf0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
29d00 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ery()..*/.void s
29d10 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
29d20 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  ose(Fts5IndexIte
29d30 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
29d40 20 20 69 66 28 20 70 49 6e 64 65 78 49 74 65 72    if( pIndexIter
29d50 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72   ){.    Fts5Iter
29d60 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
29d70 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
29d80 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
29d90 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
29da0 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
29db0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
29dc0 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c  ter);.    fts5Cl
29dd0 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78  oseReader(pIndex
29de0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
29df0 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20  Read and decode 
29e00 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
29e10 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64  ecord from the d
29e20 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
29e30 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65  Parameter anSize
29e40 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
29e50 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20  n array of size 
29e60 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c  nCol, where nCol
29e70 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
29e80 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
29e90 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
29ea0 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
29eb0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
29ec0 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
29ed0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
29ee0 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
29ef0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  Size){.  int nCo
29f00 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
29f10 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61  nCol;.  Fts5Data
29f20 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52   *pData;..  *pnR
29f30 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ow = 0;.  memset
29f40 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65  (anSize, 0, size
29f50 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b  of(i64) * nCol);
29f60 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
29f70 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
29f80 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
29f90 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
29fa0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
29fb0 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->nn ){.    int 
29fc0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
29fd0 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  Col;.    i += ft
29fe0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
29ff0 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
2a000 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28  pnRow);.    for(
2a010 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d  iCol=0; i<pData-
2a020 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c  >nn && iCol<nCol
2a030 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
2a040 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
2a050 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
2a060 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b  , (u64*)&anSize[
2a070 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol]);.    }.  
2a080 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
2a090 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
2a0a0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
2a0b0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
2a0c0 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
2a0d0 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73  urrent "averages
2a0e0 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68  " record with th
2a0f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a100 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70  e buffer .** sup
2a110 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63  plied as the sec
2a120 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
2a130 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2a140 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
2a150 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
2a160 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
2a170 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73  int nData){.  as
2a180 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
2a190 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
2a1a0 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
2a1b0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2a1c0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
2a1d0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2a1e0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2a1f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2a200 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2a210 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
2a220 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
2a230 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
2a240 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
2a250 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
2a260 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a270 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
2a280 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
2a290 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f  n p->nRead;.}../
2a2a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d  *.** Set the 32-
2a2b0 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  bit cookie value
2a2c0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
2a2d0 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75  tart of all stru
2a2e0 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64  cture .** record
2a2f0 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  s to the value p
2a300 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a310 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
2a320 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2a330 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2a340 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
2a350 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2a360 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
2a370 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2a380 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
2a390 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  kie(Fts5Index *p
2a3a0 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69  , int iNew){.  i
2a3b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a3e0 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
2a3f0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
2a400 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20  >pConfig;    /* 
2a410 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
2a420 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f  ject */.  u8 aCo
2a430 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20  okie[4];        
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a450 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65  * Binary represe
2a460 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20  ntation of iNew 
2a470 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
2a480 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20  b *pBlob = 0;.. 
2a490 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
2a4a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
2a4b0 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
2a4c0 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
2a4d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2a4e0 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
2a4f0 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  g->db, pConfig->
2a500 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
2a510 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22  , .      "block"
2a520 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
2a530 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f  _ROWID, 1, &pBlo
2a540 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  b.  );.  if( rc=
2a550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a560 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
2a570 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
2a580 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
2a590 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
2a5a0 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
2a5b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2a5c0 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
2a5d0 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e  Fts5IndexLoadCon
2a5e0 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fig(Fts5Index *p
2a5f0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
2a600 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70  re *pStruct;.  p
2a610 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2a620 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
2a630 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2a640 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2a650 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2a660 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2a670 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2a680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2a6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a700 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
2a710 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
2a720 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2a730 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
2a740 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63  y-check .** func
2a750 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f  tionality..*/../
2a760 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
2a770 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
2a780 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
2a790 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
2a7a0 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
2a7b0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
2a7c0 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
2a7d0 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
2a7e0 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49   iPos, .  int iI
2a7f0 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
2a800 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e   *pTerm,.  int n
2a810 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
2a820 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
2a830 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
2a840 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
2a850 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
2a860 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69   + iPos;.  if( i
2a870 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20  Idx>=0 ) ret += 
2a880 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35  (ret<<3) + (FTS5
2a890 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
2a8a0 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Idx);.  for(i=0;
2a8b0 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
2a8c0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2a8d0 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
2a8e0 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64  urn ret;.}..#ifd
2a8f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2a900 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2a910 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e  ion is purely an
2a920 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2a930 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2a940 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2a950 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2a960 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2a970 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2a980 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
2a990 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74  Instead, it test
2a9a0 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  s that the same 
2a9b0 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69  set of pgno/rowi
2a9c0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  d combinations a
2a9d0 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72  re .** visited r
2a9e0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2a9f0 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74  ther the doclist
2aa00 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65  -index identifie
2aa10 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a  d by parameters.
2aa20 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20  ** iSegid/iLeaf 
2aa30 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66  is iterated in f
2aa40 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72  orwards or rever
2aa50 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  se order..*/.sta
2aa60 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2aa70 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20  tDlidxReverse(. 
2aa80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
2aa90 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2aac0 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a  to load from */.
2aad0 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20    int iLeaf     
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73    /* Load doclis
2ab00 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  t-index for this
2ab10 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74   leaf */.){.  Ft
2ab20 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
2ab30 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63  idx = 0;.  u64 c
2ab40 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36  ksum1 = 13;.  u6
2ab50 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a  4 cksum2 = 13;..
2ab60 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
2ab70 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
2ab80 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 0, iSegid, iLe
2ab90 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
2aba0 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
2abb0 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
2abc0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
2abd0 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  xt(p, pDlidx).  
2abe0 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
2abf0 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
2ac00 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
2ac10 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
2ac20 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2ac30 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
2ac40 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66  sert( pgno>iLeaf
2ac50 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b   );.    cksum1 +
2ac60 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
2ac70 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
2ac80 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
2ac90 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
2aca0 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
2acb0 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
2acc0 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c  dxIterInit(p, 1,
2acd0 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
2ace0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2acf0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
2ad00 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
2ad10 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
2ad20 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
2ad30 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
2ad40 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2ad50 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
2ad60 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
2ad70 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2ad80 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
2ad90 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  ( fts5DlidxIterP
2ada0 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61  gno(pDlidx)>iLea
2adb0 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20  f );.    cksum2 
2adc0 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
2add0 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
2ade0 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
2adf0 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
2ae00 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
2ae10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2ae20 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
2ae30 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2ae40 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  FTS5_CORRUPT;.}.
2ae50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2ae60 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74  QueryCksum(.  Ft
2ae70 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae90 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65   Fts5 index obje
2aea0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
2aeb0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2aec0 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
2aed0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79      /* Index key
2aee0 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
2aef0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e     /* Size of in
2af20 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73  dex key in bytes
2af30 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
2af60 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  or Fts5IndexQuer
2af70 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73  y */.  u64 *pCks
2af80 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
2af90 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2afa0 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  : Checksum value
2afb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
2afc0 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
2afd0 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36  g->eDetail;.  u6
2afe0 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
2aff0 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
2b000 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
2b010 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2b020 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
2b030 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20  p, z, n, flags, 
2b040 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77  0, &pIter);..  w
2b050 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2b060 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
2b070 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
2b080 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72  er) ){.    i64 r
2b090 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52  owid = pIter->iR
2b0a0 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65  owid;..    if( e
2b0b0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2b0c0 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2b0d0 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74    cksum ^= sqlit
2b0e0 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2b0f0 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20  Cksum(rowid, 0, 
2b100 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a  0, iIdx, z, n);.
2b110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b120 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
2b130 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
2b140 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
2b150 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
2b160 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c  it(pIter->pData,
2b170 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26   pIter->nData, &
2b180 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  sReader);.      
2b190 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66      sReader.bEof
2b1a0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ==0;.          s
2b1b0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2b1c0 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65  tReaderNext(&sRe
2b1d0 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20  ader).      ){. 
2b1e0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
2b1f0 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
2b200 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  N(sReader.iPos);
2b210 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
2b220 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
2b230 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
2b240 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2b250 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2b260 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
2b270 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
2b280 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
2b290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b2a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b2b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2b2c0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2b2d0 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20  Next(pIter);.   
2b2e0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2b2f0 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49  Fts5IterClose(pI
2b300 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d  ter);..  *pCksum
2b310 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75   = cksum;.  retu
2b320 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2b330 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b340 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e  s also purely an
2b350 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2b360 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2b370 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2b380 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2b390 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2b3a0 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2b3b0 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61   any way..*/.sta
2b3c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2b3d0 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  tTerm(.  Fts5Ind
2b3e0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75  ex *p, .  Fts5Bu
2b3f0 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20  ffer *pPrev,    
2b400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
2b410 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
2b420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
2b430 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
2b440 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20  /* Possibly new 
2b450 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a  term to test */.
2b460 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a    u64 expected,.
2b470 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b    u64 *pCksum.){
2b480 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
2b490 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e  c;.  if( pPrev->
2b4a0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
2b4b0 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70  BufferSet(&rc, p
2b4c0 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  Prev, n, (const 
2b4d0 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a  u8*)z);.  }else.
2b4e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b4f0 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e  _OK && (pPrev->n
2b500 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50  !=n || memcmp(pP
2b510 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29  rev->p, z, n)) )
2b520 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33  {.    u64 cksum3
2b530 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20   = *pCksum;.    
2b540 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
2b550 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
2b560 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20  )&pPrev->p[1];  
2b570 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65  /* term sans pre
2b580 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20  fix-byte */.    
2b590 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65  int nTerm = pPre
2b5a0 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20  v->n-1;         
2b5b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
2b5c0 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
2b5d0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28      int iIdx = (
2b5e0 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54  pPrev->p[0] - FT
2b5f0 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b  S5_MAIN_PREFIX);
2b600 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
2b610 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20   (iIdx==0 ? 0 : 
2b620 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2b630 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34  PREFIX);.    u64
2b640 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36   ck1 = 0;.    u6
2b650 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20  4 ck2 = 0;..    
2b660 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2b670 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
2b680 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44  ed for ASC and D
2b690 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a  ESC queries are.
2b6a0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
2b6b0 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68   If not, call th
2b6c0 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  is corruption.  
2b6d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  */.    rc = fts5
2b6e0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2b6f0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2b700 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a  , flags, &ck1);.
2b710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2b730 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
2b740 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
2b750 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  C;.      rc = ft
2b760 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2b770 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2b780 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
2b790 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b7a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
2b7b0 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
2b7c0 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
2b7d0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2b7e0 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68  prefix query, ch
2b7f0 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
2b800 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66  ults returned if
2b810 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
2b820 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65  index is disable
2b830 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  d are the same. 
2b840 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20  In both ASC and 
2b850 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20  DESC order. .   
2b860 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2b870 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62  check may only b
2b880 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  e performed if t
2b890 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73  he hash table is
2b8a0 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20   empty. This.   
2b8b0 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74   ** is because t
2b8c0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e  he hash table on
2b8d0 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69  ly supports a si
2b8e0 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20  ngle scan query 
2b8f0 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65  at.    ** a time
2b900 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d  , and the multi-
2b910 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77  iter loop from w
2b920 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69  hich this functi
2b930 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  on is called.   
2b940 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70   ** is already p
2b950 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61  erforming such a
2b960 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   scan. */.    if
2b970 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
2b980 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
2b990 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
2b9a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b9b0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
2b9c0 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
2b9d0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20  RY_TEST_NOIDX;. 
2b9e0 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
2b9f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2ba00 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2ba10 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2ba20 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2ba30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ba40 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
2ba50 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
2ba60 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2ba70 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
2ba80 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2ba90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
2baa0 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2bab0 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
2bac0 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f  NOIDX|FTS5INDEX_
2bad0 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
2bae0 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20      ck2 = 0;.   
2baf0 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
2bb00 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2bb10 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2bb20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
2bb30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bb40 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
2bb50 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
2bb60 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
2bb70 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e   }..    cksum3 ^
2bb80 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42  = ck1;.    fts5B
2bb90 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
2bba0 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
2bbb0 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  8*)z);..    if( 
2bbc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2bbd0 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65   cksum3!=expecte
2bbe0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
2bbf0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2bc00 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20    }.    *pCksum 
2bc10 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20  = cksum3;.  }.  
2bc20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a  p->rc = rc;.}. .
2bc30 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
2bc40 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
2bc50 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66  rse(x,y,z).# def
2bc60 69 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d  ine fts5TestTerm
2bc70 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
2bc80 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
2bc90 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  k that:.**.**   
2bca0 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66  1) All leaves of
2bcb0 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46   pSeg between iF
2bcc0 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28  irst and iLast (
2bcd0 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74  inclusive) exist
2bce0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e   and.**      con
2bcf0 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e  tain zero terms.
2bd00 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61  .**   2) All lea
2bd10 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
2bd20 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64  een iNoRowid and
2bd30 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76   iLast (inclusiv
2bd40 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20  e) exist and.** 
2bd50 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72       contain zer
2bd60 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61  o rowids..*/.sta
2bd70 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
2bd80 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2bd90 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64  Empty(.  Fts5Ind
2bda0 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72  ex *p,.  Fts5Str
2bdb0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2bdc0 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg,     /* Segm
2bdd0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
2bde0 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
2bdf0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
2be00 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69  t,.  int iNoRowi
2be10 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29  d,.  int iLast.)
2be20 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
2be30 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
2be40 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
2be50 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
2be60 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2be70 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74  f.  ** (a) exist
2be80 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2be90 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20   no terms. */.  
2bea0 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d  for(i=iFirst; p-
2beb0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2bec0 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29  & i<=iLast; i++)
2bed0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
2bee0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2bef0 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
2bf00 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2bf10 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20  >iSegid, i));.  
2bf20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
2bf30 20 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65       if( !fts5Le
2bf40 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
2bf50 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
2bf60 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2bf70 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69    if( i>=iNoRowi
2bf80 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66  d && 0!=fts5Leaf
2bf90 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2bfa0 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  eaf) ) p->rc = F
2bfb0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2bfc0 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
2bfd0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2bfe0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
2bff0 64 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43  d fts5IntegrityC
2c000 68 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e  heckPgidx(Fts5In
2c010 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61  dex *p, Fts5Data
2c020 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
2c030 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
2c040 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42  int ii;..  Fts5B
2c050 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c  uffer buf1 = {0,
2c060 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66  0,0};.  Fts5Buff
2c070 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30  er buf2 = {0,0,0
2c080 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66  };..  ii = pLeaf
2c090 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c  ->szLeaf;.  whil
2c0a0 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20  e( ii<pLeaf->nn 
2c0b0 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
2c0c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
2c0d0 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  es;.    int iOff
2c0e0 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b  ;.    int nIncr;
2c0f0 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35  ..    ii += fts5
2c100 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c110 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72  af->p[ii], nIncr
2c120 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20  );.    iTermOff 
2c130 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f  += nIncr;.    iO
2c140 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a  ff = iTermOff;..
2c150 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c      if( iOff>=pL
2c160 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c170 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2c180 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2c190 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
2c1a0 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20  f==nIncr ){.    
2c1b0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
2c1c0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2c1d0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2c1e0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  f->p[iOff], nByt
2c1f0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  e);.      if( (i
2c200 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66  Off+nByte)>pLeaf
2c210 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2c220 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2c230 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
2c250 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2c260 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
2c270 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
2c280 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  f]);.      }.   
2c290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2c2a0 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a  t nKeep, nByte;.
2c2b0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2c2c0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2c2d0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2c2e0 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66  Keep);.      iOf
2c2f0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2c300 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2c310 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2c320 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75      if( nKeep>bu
2c330 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42  f1.n || (iOff+nB
2c340 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  yte)>pLeaf->szLe
2c350 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
2c360 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2c370 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
2c380 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20  .        buf1.n 
2c390 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
2c3a0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
2c3b0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
2c3c0 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65  uf1, nByte, &pLe
2c3d0 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  af->p[iOff]);.  
2c3e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2c3f0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2c400 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  K ){.        res
2c410 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
2c420 70 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66  pare(&buf1, &buf
2c430 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
2c440 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d  res<=0 ) p->rc =
2c450 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c460 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c470 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2c480 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75  p->rc, &buf2, bu
2c490 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20  f1.n, buf1.p);. 
2c4a0 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
2c4b0 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66  Free(&buf1);.  f
2c4c0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2c4d0 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  uf2);.}..static 
2c4e0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
2c4f0 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
2c500 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ent(.  Fts5Index
2c510 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2c520 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
2c530 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
2c540 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2c550 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20  Segment *pSeg   
2c560 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
2c570 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20   check internal 
2c580 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29  consistency */.)
2c590 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
2c5a0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
2c5b0 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nfig;.  sqlite3_
2c5c0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2c5d0 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e  .  int rc2;.  in
2c5e0 74 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d  t iIdxPrevLeaf =
2c5f0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2c600 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78  -1;.  int iDlidx
2c610 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2c620 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66  >pgnoLast;..  if
2c630 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
2c640 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  t==0 ) return;..
2c650 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
2c660 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74  reStmt(p, &pStmt
2c670 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
2c680 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
2c690 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70   segid, term, (p
2c6a0 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31  gno>>1), (pgno&1
2c6b0 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64  ) FROM %Q.'%q_id
2c6c0 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25  x' WHERE segid=%
2c6d0 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  d",.      pConfi
2c6e0 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
2c6f0 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53  >zName, pSeg->iS
2c700 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  egid.  ));..  /*
2c710 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
2c720 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
2c730 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69  archy.  */.  whi
2c740 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
2c750 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2c760 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2c770 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69  (pStmt) ){.    i
2c780 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c7a0 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
2c7b0 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
2c7c0 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
2c7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2c7e0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2c7f0 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54  /..    int nIdxT
2c800 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  erm = sqlite3_co
2c810 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
2c820 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 1);.    const 
2c830 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d  char *zIdxTerm =
2c840 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2c850 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2c860 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
2c870 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20   int iIdxLeaf = 
2c880 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2c890 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  nt(pStmt, 2);.  
2c8a0 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20    int bIdxDlidx 
2c8b0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2c8c0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
2c8d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c  .    /* If the l
2c8e0 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  eaf in question 
2c8f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2c900 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68   trimmed from th
2c910 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20  e segment, .    
2c920 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62  ** ignore this b
2c930 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68  -tree entry. Oth
2c940 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20  erwise, load it 
2c950 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a  into memory. */.
2c960 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66      if( iIdxLeaf
2c970 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  <pSeg->pgnoFirst
2c980 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c990 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47   iRow = FTS5_SEG
2c9a0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2c9b0 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61  >iSegid, iIdxLea
2c9c0 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20  f);.    pLeaf = 
2c9d0 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
2c9e0 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  iRow);.    if( p
2c9f0 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
2ca00 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
2ca10 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e  hat the leaf con
2ca20 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
2ca30 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61  ne term, and tha
2ca40 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20  t it is equal.  
2ca50 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65    ** to or large
2ca60 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74  r than the split
2ca70 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d  -key in zIdxTerm
2ca80 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  .  Also check th
2ca90 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  at if there.    
2caa0 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77  ** is also a row
2cab0 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69  id pointer withi
2cac0 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
2cad0 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74  header, it point
2cae0 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f  s to a.    ** lo
2caf0 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  cation before th
2cb00 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  e term.  */.    
2cb10 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70  if( pLeaf->nn<=p
2cb20 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2cb30 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2cb40 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2cb50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2cb60 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
2cb70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2cb80 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  et of first term
2cb90 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20   on leaf */.    
2cba0 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b    int iRowidOff;
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cbc0 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
2cbd0 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a   rowid on leaf *
2cbe0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  /.      int nTer
2cbf0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2cc00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2cc10 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
2cc20 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
2cc30 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
2cc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2cc50 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
2cc60 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
2cc70 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
2cc80 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
2cc90 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2cca0 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
2ccb0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2ccc0 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2ccd0 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
2cce0 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66 3e 3d 70  =iOff || iOff>=p
2ccf0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2cd00 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2cd10 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2cd20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cd30 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2cd40 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2cd50 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
2cd60 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
2cd70 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
2cd80 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65  >p[iOff], zIdxTe
2cd90 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e  rm, MIN(nTerm, n
2cda0 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  IdxTerm));.     
2cdb0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
2cdc0 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49  res = nTerm - nI
2cdd0 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
2cde0 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72  if( res<0 ) p->r
2cdf0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ce00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ce10 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
2ce20 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61  eckPgidx(p, pLea
2ce30 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  f);.    }.    ft
2ce40 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2ce50 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
2ce60 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
2ce70 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
2ce80 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
2ce90 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
2cea0 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
2ceb0 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29   leaf.    ** (a)
2cec0 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
2ced0 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
2cee0 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65   */.    fts5Inde
2cef0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
2cf00 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c  mpty(.        p,
2cf10 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c   pSeg, iIdxPrevL
2cf20 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65  eaf+1, iDlidxPre
2cf30 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61  vLeaf+1, iIdxLea
2cf40 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  f-1.    );.    i
2cf50 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b  f( p->rc ) break
2cf60 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2cf70 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
2cf80 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61  index, check tha
2cf90 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74  t it looks right
2cfa0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64  . */.    if( bId
2cfb0 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  xDlidx ){.      
2cfc0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
2cfd0 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
2cfe0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
2cff0 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
2d000 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2d010 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78  iPrevLeaf = iIdx
2d020 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
2d030 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
2d040 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
2d050 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20   iPg = 0;.      
2d060 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20  i64 iKey;..     
2d070 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2d080 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2d090 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78   0, iSegid, iIdx
2d0a0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
2d0b0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
2d0c0 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
2d0d0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2d0e0 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20  lidxIterNext(p, 
2d0f0 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b  pDlidx).      ){
2d100 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
2d110 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73  ck any rowid-les
2d120 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63 63  s pages that occ
2d130 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ur before the cu
2d140 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
2d150 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69         for(iPg=i
2d160 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c  PrevLeaf+1; iPg<
2d170 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2d180 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b  o(pDlidx); iPg++
2d190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65  ){.          iKe
2d1a0 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
2d1b0 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
2d1c0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
2d1d0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2d1e0 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
2d1f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
2d200 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2d210 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69 72   if( fts5LeafFir
2d220 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2d230 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  )!=0 ) p->rc = F
2d240 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2d250 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2d260 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2d270 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d290 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44  PrevLeaf = fts5D
2d2a0 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2d2b0 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2d2c0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2d2d0 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63   leaf page indic
2d2e0 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
2d2f0 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  ator really does
2d300 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
2d310 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75  ain the rowid su
2d320 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73  ggested by the s
2d330 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ame. */.        
2d340 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d  iKey = FTS5_SEGM
2d350 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
2d360 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20  , iPrevLeaf);.  
2d370 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
2d380 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
2d390 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2d3a0 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
2d3b0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
2d3c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
2d3d0 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
2d3e0 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2d3f0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2d400 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
2d410 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  OK(pLeaf);.     
2d420 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
2d430 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
2d440 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2d450 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2d460 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2d470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d480 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
2d490 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77  t(&pLeaf->p[iRow
2d4a0 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  idOff], (u64*)&i
2d4b0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2d4c0 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d      if( iRowid!=
2d4d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2d4e0 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e  id(pDlidx) ) p->
2d4f0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2d500 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2d510 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2d520 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2d530 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d540 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78   }..      iDlidx
2d550 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a  PrevLeaf = iPg;.
2d560 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2d570 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
2d580 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44  .      fts5TestD
2d590 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69  lidxReverse(p, i
2d5a0 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2d5b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d5c0 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61     iDlidxPrevLea
2d5d0 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  f = pSeg->pgnoLa
2d5e0 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44  st;.      /* TOD
2d5f0 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69  O: Check there i
2d600 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64  s no doclist ind
2d610 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ex */.    }..   
2d620 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
2d630 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20  iIdxLeaf;.  }.. 
2d640 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
2d650 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2d660 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2d670 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
2d680 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65   rc2;..  /* Page
2d690 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74   iter.iLeaf must
2d6a0 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68   now be the righ
2d6b0 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20  tmost leaf-page 
2d6c0 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a  in the segment *
2d6d0 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d  /.#if 0.  if( p-
2d6e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2d6f0 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53  & iter.iLeaf!=pS
2d700 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
2d710 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2d720 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65  _CORRUPT;.  }.#e
2d730 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ndif.}.../*.** R
2d740 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  un internal chec
2d750 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ks to ensure tha
2d760 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  t the FTS index 
2d770 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  (a) is internall
2d780 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74  y .** consistent
2d790 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2d7a0 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68  s entries for wh
2d7b0 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74  ich the XOR of t
2d7c0 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  he checksums.** 
2d7d0 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  as calculated by
2d7e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2d7f0 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73  xEntryCksum() is
2d800 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65   cksum..**.** Re
2d810 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d820 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68  UPT if any of th
2d830 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  e internal check
2d840 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68  s fail, or if th
2d850 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f  e.** checksum do
2d860 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65  es not match. Re
2d870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2d880 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73  f all checks pas
2d890 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72  s without.** err
2d8a0 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  or, or some othe
2d8b0 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  r SQLite error c
2d8c0 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65  ode if another e
2d8d0 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a  rror (e.g. OOM).
2d8e0 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
2d8f0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2d900 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2d910 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75  (Fts5Index *p, u
2d920 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  64 cksum){.  int
2d930 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
2d940 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
2d950 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30    u64 cksum2 = 0
2d960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d970 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2d980 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
2d990 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
2d9a0 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
2d9b0 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  st = {0,0,0};   
2d9c0 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
2d9d0 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74  o hold a poslist
2d9e0 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
2d9f0 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
2da00 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
2da10 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2da20 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f   entire index */
2da30 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2da40 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20   *pStruct;      
2da50 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
2da60 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66  cture */..#ifdef
2da70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2da80 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61  /* Used by extra
2da90 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20   internal tests 
2daa0 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42  only run if NDEB
2dab0 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
2dac0 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d  d */.  u64 cksum
2dad0 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  3 = 0;          
2dae0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
2daf0 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
2db00 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
2db10 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2db20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  term = {0,0,0}; 
2db30 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
2db40 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74  sed to hold most
2db50 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a   recent term */.
2db60 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 69  #endif.  const i
2db70 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49  nt flags = FTS5I
2db80 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
2db90 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61  PUT;.  .  /* Loa
2dba0 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  d the FTS index 
2dbb0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
2dbc0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2dbd0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
2dbe0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2dbf0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2dc00 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
2dc10 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
2dc20 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  ves */.  if( pSt
2dc30 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
2dc40 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
2dc50 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
2dc60 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
2dc70 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
2dc80 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2dc90 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
2dca0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
2dcb0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46  eg++){.        F
2dcc0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2dcd0 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74  ent *pSeg = &pSt
2dce0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
2dcf0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
2dd00 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78         fts5Index
2dd10 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2dd20 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a  gment(p, pSeg);.
2dd30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dd40 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75  }..  /* The cksu
2dd50 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  m argument passe
2dd60 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2dd70 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d  on is a checksum
2dd80 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a   calculated.  **
2dd90 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78   based on all ex
2dda0 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69  pected entries i
2ddb0 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
2ddc0 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69  (including prefi
2ddd0 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74  x index.  ** ent
2dde0 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63  ries). This bloc
2ddf0 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20  k checks that a 
2de00 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
2de10 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
2de20 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e  .  ** actual con
2de30 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64  tents of FTS ind
2de40 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e  ex is identical.
2de50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76  .  **.  ** Two v
2de60 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  ersions of the s
2de70 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65  ame checksum are
2de80 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65   calculated. The
2de90 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20   first (stack.  
2dea0 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75  ** variable cksu
2deb0 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74  m2) based on ent
2dec0 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66  ries extracted f
2ded0 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  rom the full-tex
2dee0 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69  t index.  ** whi
2def0 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61  le doing a linea
2df00 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69  r scan of each i
2df10 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20  ndividual index 
2df20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20  in turn. .  **. 
2df30 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d   ** As each term
2df40 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
2df50 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20  linear scans, a 
2df60 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66  separate query f
2df70 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  or the.  ** same
2df80 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d   term is perform
2df90 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61  ed. cksum3 is ca
2dfa0 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
2dfb0 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20  n the entries.  
2dfc0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ** extracted by 
2dfd0 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20  these queries.. 
2dfe0 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   */.  for(fts5Mu
2dff0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
2e000 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c  truct, flags, 0,
2e010 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
2e020 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
2e030 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
2e040 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
2e050 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
2e060 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
2e070 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
2e080 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
2e090 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2e0a0 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
2e0b0 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
2e0c0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2e0d0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2e0e0 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
2e0f0 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
2e100 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
2e110 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2e120 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
2e130 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
2e140 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
2e150 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
2e160 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
2e170 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
2e180 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
2e190 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2e1a0 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
2e1b0 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
2e1c0 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
2e1d0 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
2e1e0 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72  .    fts5TestTer
2e1f0 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e  m(p, &term, z, n
2e200 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
2e210 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  3);..    if( eDe
2e220 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
2e230 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
2e240 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69  if( 0==fts5Multi
2e250 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
2e260 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Iter) ){.       
2e270 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74   cksum2 ^= sqlit
2e280 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2e290 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c  Cksum(iRowid, 0,
2e2a0 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20   0, -1, z, n);. 
2e2b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e2c0 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74 2e  {.      poslist.
2e2d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73  n = 0;.      fts
2e2e0 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
2e2f0 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
2e300 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
2e310 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f  .iFirst], 0, &po
2e320 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  slist);.      wh
2e330 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46  ile( 0==sqlite3F
2e340 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
2e350 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c  (poslist.p, posl
2e360 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69  ist.n, &iOff, &i
2e370 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos) ){.        
2e380 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
2e390 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29  POS2COLUMN(iPos)
2e3a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  ;.        int iT
2e3b0 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53  okOff = FTS5_POS
2e3c0 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20  2OFFSET(iPos);. 
2e3d0 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d         cksum2 ^=
2e3e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2e3f0 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
2e400 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66  id, iCol, iTokOf
2e410 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  f, -1, z, n);.  
2e420 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2e430 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
2e440 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63  , &term, 0, 0, c
2e450 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
2e460 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
2e470 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
2e480 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2e490 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
2e4a0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2e4b0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
2e4c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2e4d0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2e4e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e4f0 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72  BUG.  fts5Buffer
2e500 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e  Free(&term);.#en
2e510 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72  dif.  fts5Buffer
2e520 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a  Free(&poslist);.
2e530 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2e540 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2e550 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2e560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2e5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5e0 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
2e5f0 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
2e600 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e610 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2e620 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66  de() scalar.** f
2e630 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f  unction only..*/
2e640 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
2e650 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f   segment-data ro
2e660 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  wid from the %_d
2e670 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ata table. This 
2e680 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74  function is.** t
2e690 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d  he opposite of m
2e6a0 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e  acro FTS5_SEGMEN
2e6b0 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74  T_ROWID()..*/.st
2e6c0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2e6d0 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34  codeRowid(.  i64
2e6e0 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e700 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74  Rowid from %_dat
2e710 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2e720 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20   *piSegid,      
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e740 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20  OUT: Segment id 
2e750 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64  */.  int *pbDlid
2e760 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2e770 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69       /* OUT: Dli
2e780 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74  dx flag */.  int
2e790 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20   *piHeight,     
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e7b0 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20  OUT: Height */. 
2e7c0 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20   int *piPgno    
2e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7e0 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
2e7f0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69  mber */.){.  *pi
2e800 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f  Pgno = (int)(iRo
2e810 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
2e820 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
2e830 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
2e840 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
2e850 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69  A_PAGE_B;..  *pi
2e860 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69  Height = (int)(i
2e870 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e880 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
2e890 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20  IGHT_B) - 1));. 
2e8a0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2e8b0 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a  _DATA_HEIGHT_B;.
2e8c0 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69  .  *pbDlidx = (i
2e8d0 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30  nt)(iRowid & 0x0
2e8e0 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e  001);.  iRowid >
2e8f0 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49  >= FTS5_DATA_DLI
2e900 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20  _B;..  *piSegid 
2e910 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2e920 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2e930 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31  5_DATA_ID_B) - 1
2e940 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ));.}..static vo
2e950 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  id fts5DebugRowi
2e960 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  d(int *pRc, Fts5
2e970 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36  Buffer *pBuf, i6
2e980 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69  4 iKey){.  int i
2e990 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
2e9a0 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20  iPgno, bDlidx;  
2e9b0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f       /* Rowid co
2e9c0 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74  mpenents */.  ft
2e9d0 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b  s5DecodeRowid(iK
2e9e0 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  ey, &iSegid, &bD
2e9f0 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
2ea00 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  &iPgno);..  if( 
2ea10 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
2ea20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f   if( iKey==FTS5_
2ea30 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
2ea40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
2ea50 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2ea60 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2ea70 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b   "{averages} ");
2ea80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ea90 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2eaa0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2eab0 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72  pRc, pBuf, "{str
2eac0 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d  ucture}");.    }
2ead0 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20  .  }.  else{.   
2eae0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2eaf0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2eb00 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65  Rc, pBuf, "{%sse
2eb10 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f  gid=%d h=%d pgno
2eb20 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62  =%d}",.        b
2eb30 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22  Dlidx ? "dlidx "
2eb40 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69   : "", iSegid, i
2eb50 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
2eb60 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
2eb70 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
2eb80 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
2eb90 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ebb0 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2ebc0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2ebd0 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
2ebe0 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
2ebf0 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
2ec00 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2ec10 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
2ec20 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
2ec30 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
2ec40 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
2ec50 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2ec60 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
2ec70 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
2ec80 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
2ec90 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
2eca0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2ecb0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2ecc0 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
2ecd0 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65  %d nMerge=%d nSe
2ece0 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  g=%d", iLvl, pLv
2ecf0 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d  l->nMerge, pLvl-
2ed00 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20  >nSeg.    );.   
2ed10 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2ed20 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
2ed30 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
2ed40 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
2ed50 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
2ed60 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
2ed70 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ed80 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ed90 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69  (pRc, pBuf, " {i
2eda0 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  d=%d leaves=%d..
2edb0 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d}", .         
2edc0 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70   pSeg->iSegid, p
2edd0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
2ede0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
2edf0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
2ee00 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2ee10 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2ee20 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
2ee30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2ee40 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2ee50 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2ee60 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2ee70 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2ee80 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2ee90 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
2eea0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
2eeb0 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
2eec0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
2eed0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2eee0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2eef0 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
2ef00 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
2ef10 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
2ef20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2ef30 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2ef40 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
2ef50 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2ef60 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2ef70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2ef80 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2ef90 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2efa0 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2efb0 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2efc0 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efe0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2eff0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
2f000 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
2f010 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
2f020 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
2f030 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
2f040 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
2f050 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
2f060 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
2f070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f080 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
2f090 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2f0a0 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
2f0b0 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
2f0c0 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
2f0d0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2f0e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2f0f0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2f100 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2f110 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
2f120 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
2f130 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
2f140 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72   an "averages" r
2f150 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63  ecord. This func
2f160 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73  tion .** appends
2f170 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2f180 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2f190 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68   of record to th
2f1a0 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
2f1b0 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
2f1c0 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a  d argument. .*/.
2f1d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2f1e0 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a  DecodeAverages(.
2f1f0 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f210 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2f220 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2f230 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2f240 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2f250 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2f260 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f   int i = 0;.  co
2f270 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65  nst char *zSpace
2f280 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28   = "";..  while(
2f290 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20   i<nBlob ){.    
2f2a0 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  u64 iVal;.    i 
2f2b0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2f2c0 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69  tVarint(&pBlob[i
2f2d0 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73  ], &iVal);.    s
2f2e0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f2f0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f300 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20  , pBuf, "%s%d", 
2f310 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61  zSpace, (int)iVa
2f320 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d  l);.    zSpace =
2f330 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   " ";.  }.}../*.
2f340 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
2f350 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
2f360 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
2f370 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
2f380 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
2f390 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
2f3a0 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
2f3b0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
2f3c0 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
2f3d0 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
2f3e0 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
2f3f0 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
2f400 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
2f410 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
2f420 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2f430 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2f440 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2f450 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2f460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f470 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2f480 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2f490 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2f4a0 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2f4b0 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
2f4c0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
2f4d0 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
2f4e0 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
2f4f0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2f500 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  &a[iOff], iVal);
2f510 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f520 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f530 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2f540 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a  %d", iVal);.  }.
2f550 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
2f560 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72  ../*.** The star
2f570 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e  t of buffer (a/n
2f580 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  ) contains the s
2f590 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  tart of a doclis
2f5a0 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a  t. The doclist.*
2f5b0 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  * may or may not
2f5c0 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74   finish within t
2f5d0 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  he buffer. This 
2f5e0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2f5f0 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65   a text.** repre
2f600 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2f610 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63   part of the doc
2f620 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65  list that is pre
2f630 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a  sent to buffer.*
2f640 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54  * pBuf. .**.** T
2f650 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2f660 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2f670 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2f680 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2f690 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f6a0 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2f6b0 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2f6c0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2f6d0 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2f6e0 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64  n){.  i64 iDocid
2f6f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
2f700 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30   = 0;..  if( n>0
2f710 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73   ){.    iOff = s
2f720 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2f730 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44  int(a, (u64*)&iD
2f740 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ocid);.    sqlit
2f750 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f760 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f770 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2f780 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77  iDocid);.  }.  w
2f790 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
2f7a0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
2f7b0 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20    int bDel;.    
2f7c0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
2f7d0 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f  oslistSize(&a[iO
2f7e0 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65  ff], &nPos, &bDe
2f7f0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2f800 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2f810 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2f820 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e   " nPos=%d%s", n
2f830 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22  Pos, bDel?"*":""
2f840 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
2f850 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2f860 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69  (pRc, pBuf, &a[i
2f870 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66  Off], MIN(n-iOff
2f880 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66  , nPos));.    if
2f890 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2f8a0 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
2f8b0 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
2f8c0 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2f8d0 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
2f8e0 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
2f8f0 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
2f900 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
2f910 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f920 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f930 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44  , " id=%lld", iD
2f940 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ocid);.    }.  }
2f950 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  ..  return iOff;
2f960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2f970 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
2f980 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2f990 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 66  de() debugging f
2f9a0 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a  unction. It is .
2f9b0 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  ** only ever use
2f9c0 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f  d with detail=no
2f9d0 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ne tables..**.**
2f9e0 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f 6e   Buffer (pData/n
2f9f0 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20 61  Data) contains a
2fa00 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20   doclist in the 
2fa10 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20 64  format used by d
2fa20 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61  etail=none.** ta
2fa30 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74  bles. This funct
2fa40 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
2fa50 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72  man-readable ver
2fa60 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69 73  sion of that lis
2fa70 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  t to.** buffer p
2fa80 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  Buf..**.** If *p
2fa90 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
2faa0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2fab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2fac0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2fad0 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e  .** no-op. If an
2fae0 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65 72   OOM or other er
2faf0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
2fb00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
2fb10 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74 20   *pRc is.** set 
2fb20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
2fb30 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72  or code before r
2fb40 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66 69  eturning. The fi
2fb50 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75 66  nal state of buf
2fb60 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20 75  fer.** pBuf is u
2fb70 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2fb80 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2fb90 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2fba0 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e 74  RowidList(.  int
2fbb0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fbd0 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
2fbe0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2fbf0 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
2fc00 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
2fc10 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74  r to append text
2fc20 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   to */.  const u
2fc30 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
2fc40 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ata      /* Data
2fc50 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74 2d   to decode list-
2fc60 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a  of-rowids from *
2fc70 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  /.){.  int i = 0
2fc80 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d  ;.  i64 iRowid =
2fc90 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c   0;..  while( i<
2fca0 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e  nData ){.    con
2fcb0 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d 20  st char *zApp = 
2fcc0 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61 6c  "";.    u64 iVal
2fcd0 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
2fce0 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2fcf0 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c  &pData[i], &iVal
2fd00 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b 3d  );.    iRowid +=
2fd10 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20   iVal;..    if( 
2fd20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61  i<nData && pData
2fd30 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20  [i]==0x00 ){.   
2fd40 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
2fd50 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2fd60 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2fd70 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2fd80 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a      zApp = "+";.
2fd90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fda0 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b       zApp = "*";
2fdb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2fdc0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2fdd0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2fde0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2fdf0 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c 20  lld%s", iRowid, 
2fe00 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zApp);.  }.}../*
2fe10 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
2fe20 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
2fe30 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2fe40 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
2fe50 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
2fe60 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
2fe70 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2fe80 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2fe90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2fea0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2feb0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2fec0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2fed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fee0 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2fef0 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2ff00 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2ff10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2ff20 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2ff30 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
2ff40 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2ff50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2ff60 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
2ff70 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
2ff80 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67  int iSegid,iHeig
2ff90 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b  ht,iPgno,bDlidx;
2ffa0 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
2ffb0 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
2ffc0 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b  8 *aBlob; int n;
2ffd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
2ffe0 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
2fff0 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46    u8 *a = 0;.  F
30000 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
30010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30020 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
30030 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
30040 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
30050 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
30060 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30070 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
30080 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44  ce = 0;.  int eD
30090 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c  etailNone = (sql
300a0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
300b0 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73  Ctx)!=0);..  ass
300c0 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a  ert( nArg==2 );.
300d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e    UNUSED_PARAM(n
300e0 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Arg);.  memset(&
300f0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
30100 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f  5Buffer));.  iRo
30110 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
30120 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
30130 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0]);..  /* Make 
30140 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
30150 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61  cond argument (a
30160 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b   blob) in aBlob[
30170 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20  ]. The aBlob[]. 
30180 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c   ** copy is foll
30190 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54  owed by FTS5_DAT
301a0 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30  A_ZERO_PADDING 0
301b0 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68  x00 bytes, which
301c0 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62   prevents.  ** b
301d0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20  uffer overreads 
301e0 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f  even if the reco
301f0 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  rd is corrupt.  
30200 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  */.  n = sqlite3
30210 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
30220 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20  al[1]);.  aBlob 
30230 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
30240 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  blob(apVal[1]);.
30250 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46    nSpace = n + F
30260 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
30270 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38  DDING;.  a = (u8
30280 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
30290 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70  locZero(&rc, nSp
302a0 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30  ace);.  if( a==0
302b0 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f   ) goto decode_o
302c0 75 74 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 20  ut;.  if( n>0 ) 
302d0 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c  memcpy(a, aBlob,
302e0 20 6e 29 3b 0a 0a 20 20 66 74 73 35 44 65 63 6f   n);..  fts5Deco
302f0 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20  deRowid(iRowid, 
30300 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
30310 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
30320 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75  no);..  fts5Debu
30330 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20  gRowid(&rc, &s, 
30340 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62  iRowid);.  if( b
30350 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
30360 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20  5Data dlidx;.   
30370 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76   Fts5DlidxLvl lv
30380 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20  l;..    dlidx.p 
30390 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e  = a;.    dlidx.n
303a0 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73  n = n;..    mems
303b0 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(&lvl, 0, size
303c0 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
303d0 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61  );.    lvl.pData
303e0 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c   = &dlidx;.    l
303f0 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  vl.iLeafPgno = i
30400 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66  Pgno;..    for(f
30410 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
30420 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d  &lvl); lvl.bEof=
30430 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  =0; fts5DlidxLvl
30440 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20  Next(&lvl)){.   
30450 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
30460 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
30470 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20  (&rc, &s, .     
30480 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22       " %d(%lld)"
30490 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c  , lvl.iLeafPgno,
304a0 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20   lvl.iRowid.    
304b0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c    );.    }.  }el
304c0 73 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  se if( iSegid==0
304d0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77   ){.    if( iRow
304e0 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  id==FTS5_AVERAGE
304f0 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
30500 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61   fts5DecodeAvera
30510 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ges(&rc, &s, a, 
30520 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
30530 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53       fts5DecodeS
30540 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73  tructure(&rc, &s
30550 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , a, n);.    }. 
30560 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 74 61   }else if( eDeta
30570 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74  ilNone ){.    Ft
30580 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
30590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
305a0 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64  urrent term read
305b0 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20   from page */.  
305c0 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20    int szLeaf;.  
305d0 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20    int iPgidxOff 
305e0 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
305f0 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
30600 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a    int iTermOff;.
30610 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
30620 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  0;.    int iOff;
30630 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65  ..    memset(&te
30640 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
30650 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
30660 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65   /* Decode any e
30670 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
30680 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
30690 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
306a0 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a  if( szLeaf<n ){.
306b0 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
306c0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
306d0 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
306e0 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20  , iTermOff);.   
306f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54   }else{.      iT
30700 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b  ermOff = szLeaf;
30710 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
30720 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26  ecodeRowidList(&
30730 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69  rc, &s, &a[4], i
30740 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20  TermOff-4);..   
30750 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
30760 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66  ;.    while( iOf
30770 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  f<szLeaf ){.    
30780 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a    int nAppend;..
30790 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
307a0 65 20 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20  e term data for 
307b0 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a  the next term*/.
307c0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
307d0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
307e0 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29  [iOff], nAppend)
307f0 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d  ;.      term.n =
30800 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74   nKeep;.      ft
30810 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
30820 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
30830 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d  Append, &a[iOff]
30840 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30850 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
30860 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
30870 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72    &rc, &s, " ter
30880 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c  m=%.*s", term.n,
30890 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65   (const char*)te
308a0 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20  rm.p.      );.  
308b0 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70      iOff += nApp
308c0 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  end;..      /* F
308d0 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
308e0 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
308f0 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a  this term ends *
30900 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  /.      if( iPgi
30910 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
30920 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20     int nIncr;.  
30930 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
30940 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
30950 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
30960 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20  , nIncr);.      
30970 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49    iTermOff += nI
30980 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ncr;.      }else
30990 7b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f  {.        iTermO
309a0 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
309b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
309c0 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28  DecodeRowidList(
309d0 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
309e0 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66  ], iTermOff-iOff
309f0 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  );.      iOff = 
30a00 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20  iTermOff;.      
30a10 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  if( iOff<szLeaf 
30a20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
30a30 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
30a40 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
30a50 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ep);.      }.   
30a60 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
30a70 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
30a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35   }else{.    Fts5
30a90 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
30aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
30ab0 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66  rent term read f
30ac0 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  rom page */.    
30ad0 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20  int szLeaf;     
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30af0 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64 78   Offset of pgidx
30b00 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69   in a[] */.    i
30b10 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20  nt iPgidxOff;.  
30b20 20 20 69 6e 74 20 69 50 67 69 64 78 50 72 65 76    int iPgidxPrev
30b30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30b40 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
30b50 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64  e read from pgid
30b60 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65  x */.    int iTe
30b70 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  rmOff = 0;.    i
30b80 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30  nt iRowidOff = 0
30b90 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
30ba0 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
30bb0 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  ;..    memset(&t
30bc0 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
30bd0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
30be0 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20    if( n<4 ){.   
30bf0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
30c00 66 66 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c  fferSet(&rc, &s,
30c10 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22   7, (const u8*)"
30c20 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20  corrupt");.     
30c30 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
30c40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30c50 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
30c60 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
30c70 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66  ;.      iPgidxOf
30c80 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73  f = szLeaf = fts
30c90 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
30ca0 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
30cb0 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
30cc0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30cd0 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
30ce0 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20  iTermOff);.     
30cf0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
30d00 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69   Decode the posi
30d10 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61  tion list tail a
30d20 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
30d30 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
30d40 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20  f( iRowidOff!=0 
30d50 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
30d60 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d  iRowidOff;.    }
30d70 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
30d80 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f  f!=0 ){.      iO
30d90 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20  ff = iTermOff;. 
30da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30db0 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  iOff = szLeaf;. 
30dc0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63     }.    fts5Dec
30dd0 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20  odePoslist(&rc, 
30de0 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d  &s, &a[4], iOff-
30df0 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f  4);..    /* Deco
30e00 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c  de any more docl
30e10 69 73 74 20 64 61 74 61 20 74 68 61 74 20 61 70  ist data that ap
30e20 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67  pears on the pag
30e30 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
30e40 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20   ** first term. 
30e50 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20  */.    nDoclist 
30e60 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54  = (iTermOff ? iT
30e70 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29  ermOff : szLeaf)
30e80 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73   - iOff;.    fts
30e90 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
30ea0 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
30eb0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20  , nDoclist);..  
30ec0 20 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f    while( iPgidxO
30ed0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  ff<n ){.      in
30ee0 74 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69  t bFirst = (iPgi
30ef0 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20  dxOff==szLeaf); 
30f00 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
30f10 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
30f20 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ge */.      int 
30f30 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
30f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f50 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61    /* Bytes of da
30f60 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ta */.      int 
30f70 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20  iEnd;.      .   
30f80 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20     iPgidxOff += 
30f90 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
30fa0 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
30fb0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67  Byte);.      iPg
30fc0 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65  idxPrev += nByte
30fd0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  ;.      iOff = i
30fe0 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20  PgidxPrev;..    
30ff0 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c    if( iPgidxOff<
31000 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  n ){.        fts
31010 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
31020 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74  iPgidxOff], nByt
31030 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  e);.        iEnd
31040 20 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20   = iPgidxPrev + 
31050 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c  nByte;.      }el
31060 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  se{.        iEnd
31070 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
31080 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46   }..      if( bF
31090 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
310a0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
310b0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
310c0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
310d0 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42       term.n = nB
310e0 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yte;.      }.   
310f0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
31100 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
31110 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
31120 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
31130 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65  endBlob(&rc, &te
31140 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f  rm, nByte, &a[iO
31150 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  ff]);.      iOff
31160 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20   += nByte;..    
31170 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
31180 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
31190 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20  .          &rc, 
311a0 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22  &s, " term=%.*s"
311b0 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74  , term.n, (const
311c0 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20   char*)term.p.  
311d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66      );.      iOf
311e0 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
311f0 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
31200 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69  &a[iOff], iEnd-i
31210 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Off);.    }..   
31220 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
31230 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20  &term);.  }.  . 
31240 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71  decode_out:.  sq
31250 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
31260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31270 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
31280 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
31290 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
312a0 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54  )s.p, s.n, SQLIT
312b0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
312c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
312d0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
312e0 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a  code(pCtx, rc);.
312f0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
31300 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a  Free(&s);.}../*.
31310 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
31320 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
31330 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
31340 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64  ction fts5_rowid
31350 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
31360 69 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63  id fts5RowidFunc
31370 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
31380 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
31390 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
313a0 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74  ion call context
313b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
313e0 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20  of args (always 
313f0 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  2) */.  sqlite3_
31400 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
31410 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
31420 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
31430 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
31440 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41   *zArg;.  if( nA
31450 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rg==0 ){.    sql
31460 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
31470 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20  r(pCtx, "should 
31480 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73  be: fts5_rowid(s
31490 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20  ubject, ....)", 
314a0 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
314b0 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20    zArg = (const 
314c0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
314d0 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
314e0 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  ]);.    if( 0==s
314f0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
31500 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20  Arg, "segment") 
31510 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
31520 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  wid;.      int s
31530 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20  egid, pgno;.    
31540 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b    if( nArg!=3 ){
31550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31560 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
31570 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  tx, .           
31580 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
31590 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74  5_rowid('segment
315a0 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29  ', segid, pgno))
315b0 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b  ", -1.        );
315c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
315d0 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71        segid = sq
315e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
315f0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20  apVal[1]);.     
31600 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65     pgno = sqlite
31610 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
31620 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  l[2]);.        i
31630 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
31640 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64  MENT_ROWID(segid
31650 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
31660 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
31670 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77  int64(pCtx, iRow
31680 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
31690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
316a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
316b0 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
316c0 20 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20    "first arg to 
316d0 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73  fts5_rowid() mus
316e0 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20  t be 'segment'" 
316f0 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  , -1.      );.  
31700 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
31710 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
31720 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73  as part of regis
31730 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20  tering the FTS5 
31740 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
31750 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
31760 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74  on db. It regist
31770 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72  ers several user
31780 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
31790 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c  functions useful
317a0 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a  .** with FTS5..*
317b0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
317c0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
317d0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
317e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
317f0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c  ome other.** SQL
31800 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
31810 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
31820 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
31830 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28  e3Fts5IndexInit(
31840 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
31850 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
31860 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
31870 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73  (.      db, "fts
31880 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51  5_decode", 2, SQ
31890 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
318a0 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
318b0 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69  , 0, 0.  );..  i
318c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
318d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
318e0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
318f0 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
31900 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e  , "fts5_decode_n
31910 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20  one", 2, .      
31920 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28    SQLITE_UTF8, (
31930 76 6f 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65  void*)db, fts5De
31940 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  codeFunction, 0,
31950 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
31960 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31970 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
31980 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
31990 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
319a0 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22  db, "fts5_rowid"
319b0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
319c0 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46  8, 0, fts5RowidF
319d0 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
319e0 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
319f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71  n rc;.}...int sq
31a00 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
31a10 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  set(Fts5Index *p
31a20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
31a30 70 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d  pStruct==0 || p-
31a40 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21  >iStructVersion!
31a50 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  =0 );.  if( fts5
31a60 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
31a70 28 70 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56  (p)!=p->iStructV
31a80 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74  ersion ){.    ft
31a90 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
31aa0 69 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20  idate(p);.  }.  
31ab0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
31ac0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a           Return(p);.}.