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

Artifact c8b07a5326401a9520c75493608949a0c61abd924365663df3b65a125fb34d17:


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: 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
62b0: 55 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29  U16(&pRet->p[2])
62c0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
62d0: 70 5b 6e 42 79 74 65 5d 20 3d 20 30 78 30 30 3b  p[nByte] = 0x00;
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 6e  , nSegment);.  n
74c0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73  Byte = (.      s
74d0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
74e0: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
74f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7500: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7510: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7520: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
7530: 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20  * (nLevel-1)    
7540: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7550: 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74  y */.  );.  pRet
7560: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7570: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
7580: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
7590: 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65  yte);..  if( pRe
75a0: 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  t ){.    pRet->n
75b0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52 65  Ref = 1;.    pRe
75c0: 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76  t->nLevel = nLev
75d0: 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53  el;.    pRet->nS
75e0: 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e  egment = nSegmen
75f0: 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  t;.    i += sqli
7600: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
7610: 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65  (&pData[i], &pRe
7620: 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
7630: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  );..    for(iLvl
7640: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
7650: 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c  K && iLvl<nLevel
7660: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
7670: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7680: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65  vel *pLvl = &pRe
7690: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
76a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61  .      int nTota
76b0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  l = 0;.      int
76c0: 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69 66   iSeg;..      if
76d0: 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20  ( i>=nData ){.  
76e0: 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
76f0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
7700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 20  else{.        i 
7710: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7720: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7730: 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20  vl->nMerge);.   
7740: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
7750: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7760: 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20  [i], nTotal);.  
7770: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
7780: 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72  otal>=pLvl->nMer
7790: 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ge );.        pL
77a0: 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
77b0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
77c0: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
77d0: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20  locZero(&rc, .  
77e0: 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c            nTotal
77f0: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
7800: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a  ructureSegment).
7810: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
7820: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
7830: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7840: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
7850: 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20  g = nTotal;.    
7860: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
7870: 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65  iSeg<nTotal; iSe
7880: 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
7890: 69 66 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a  if( i>=nData ){.
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
78b0: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
78c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
78d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
78e0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
78f0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7900: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
7910: 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29  eg[iSeg].iSegid)
7920: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
7930: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7940: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
7950: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
7960: 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  oFirst);.       
7970: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7980: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7990: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
79a0: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
79b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
79c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
79d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
79e0: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
79f0: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
7a00: 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30  ;.      pRet = 0
7a10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
7a20: 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20  ppOut = pRet;.  
7a30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7a40: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
7a50: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
7a60: 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52  AddLevel(int *pR
7a70: 63 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  c, Fts5Structure
7a80: 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20   **ppStruct){.  
7a90: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
7aa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
7ab0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7ac0: 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
7ad0: 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20     int nLevel = 
7ae0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
7af0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
7b00: 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f   (.        sizeo
7b10: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
7b20: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
7b30: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75      /* Main stru
7b40: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20  cture */.       
7b50: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7b60: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
7b70: 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65  Level+1)  /* aLe
7b80: 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vel[] array */. 
7b90: 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75     );..    pStru
7ba0: 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ct = sqlite3_rea
7bb0: 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42  lloc(pStruct, nB
7bc0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53  yte);.    if( pS
7bd0: 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d  truct ){.      m
7be0: 65 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e  emset(&pStruct->
7bf0: 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20  aLevel[nLevel], 
7c00: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
7c10: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a  ructureLevel));.
7c20: 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e        pStruct->n
7c30: 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a  Level++;.      *
7c40: 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
7c50: 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ct;.    }else{. 
7c60: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
7c70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7c80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74    }.}../*.** Ext
7c90: 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73  end level iLvl s
7ca0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
7cb0: 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73  room for at leas
7cc0: 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a  t nExtra more.**
7cd0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74   segments..*/.st
7ce0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
7cf0: 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
7d00: 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  el(.  int *pRc, 
7d10: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7d20: 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e   *pStruct, .  in
7d30: 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e  t iLvl, .  int n
7d40: 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49  Extra, .  int bI
7d50: 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a  nsert.){.  if( *
7d60: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
7d70: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
7d80: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
7d90: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
7da0: 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73  l[iLvl];.    Fts
7db0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7dc0: 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *aNew;.    int
7dd0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79   nByte;..    nBy
7de0: 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67  te = (pLvl->nSeg
7df0: 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a   + nExtra) * siz
7e00: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7e10: 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61  eSegment);.    a
7e20: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
7e30: 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67  alloc(pLvl->aSeg
7e40: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
7e50: 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( aNew ){.      
7e60: 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29  if( bInsert==0 )
7e70: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
7e80: 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65  (&aNew[pLvl->nSe
7e90: 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  g], 0, sizeof(Ft
7ea0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7eb0: 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20  nt) * nExtra);. 
7ec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7ed0: 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
7ee0: 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a  pLvl->nSeg * siz
7ef0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7f00: 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  eSegment);.     
7f10: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77     memmove(&aNew
7f20: 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20  [nExtra], aNew, 
7f30: 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  nMove);.        
7f40: 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20  memset(aNew, 0, 
7f50: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7f60: 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e  tureSegment) * n
7f70: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
7f80: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67        pLvl->aSeg
7f90: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c   = aNew;.    }el
7fa0: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
7fb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7fc0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
7fd0: 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
7fe0: 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52   *fts5StructureR
7ff0: 65 61 64 55 6e 63 61 63 68 65 64 28 46 74 73 35  eadUncached(Fts5
8000: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
8010: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
8020: 20 3d 20 30 3b 0a 20 20 46 74 73 35 43 6f 6e 66   = 0;.  Fts5Conf
8030: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
8040: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
8050: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
8060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8070: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
8080: 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  kie */.  Fts5Dat
8090: 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61  a *pData;..  pDa
80a0: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
80b0: 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  d(p, FTS5_STRUCT
80c0: 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66  URE_ROWID);.  if
80d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
80e0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44  OK ){.    /* TOD
80f0: 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 68  O: Do we need th
8100: 69 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d 69  is if the leaf-i
8110: 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64 65 64  ndex is appended
8120: 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f  ? Probably... */
8130: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 44 61  .    memset(&pDa
8140: 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d  ta->p[pData->nn]
8150: 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50  , 0, FTS5_DATA_P
8160: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 70 2d 3e  ADDING);.    p->
8170: 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
8180: 72 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e  reDecode(pData->
8190: 70 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69  p, pData->nn, &i
81a0: 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a  Cookie, &pRet);.
81b0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
81c0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e  QLITE_OK && pCon
81d0: 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43  fig->iCookie!=iC
81e0: 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 20 20 70  ookie ){.      p
81f0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
8200: 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f  s5ConfigLoad(pCo
8210: 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  nfig, iCookie);.
8220: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61      }.    fts5Da
8230: 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
8240: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21  ;.    if( p->rc!
8250: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8260: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
8270: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
8280: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
8290: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
82a0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn pRet;.}..sta
82b0: 74 69 63 20 69 36 34 20 66 74 73 35 49 6e 64 65  tic i64 fts5Inde
82c0: 78 44 61 74 61 56 65 72 73 69 6f 6e 28 46 74 73  xDataVersion(Fts
82d0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 36  5Index *p){.  i6
82e0: 34 20 69 56 65 72 73 69 6f 6e 20 3d 20 30 3b 0a  4 iVersion = 0;.
82f0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
8300: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
8310: 66 28 20 70 2d 3e 70 44 61 74 61 56 65 72 73 69  f( p->pDataVersi
8320: 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  on==0 ){.      p
8330: 2d 3e 72 63 20 3d 20 66 74 73 35 49 6e 64 65 78  ->rc = fts5Index
8340: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
8350: 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 2c  p->pDataVersion,
8360: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
8370: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
8380: 47 4d 41 20 25 51 2e 64 61 74 61 5f 76 65 72 73  GMA %Q.data_vers
8390: 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f 6e 66 69 67  ion", p->pConfig
83a0: 2d 3e 7a 44 62 29 0a 20 20 20 20 20 20 20 20 20  ->zDb).         
83b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
83c0: 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >rc ) return 0;.
83d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 53      }..    if( S
83e0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
83f0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 61 74 61  e3_step(p->pData
8400: 56 65 72 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20  Version) ){.    
8410: 20 20 69 56 65 72 73 69 6f 6e 20 3d 20 73 71 6c    iVersion = sql
8420: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
8430: 34 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  4(p->pDataVersio
8440: 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  n, 0);.    }.   
8450: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
8460: 5f 72 65 73 65 74 28 70 2d 3e 70 44 61 74 61 56  _reset(p->pDataV
8470: 65 72 73 69 6f 6e 29 3b 0a 20 20 7d 0a 0a 20 20  ersion);.  }..  
8480: 72 65 74 75 72 6e 20 69 56 65 72 73 69 6f 6e 3b  return iVersion;
8490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
84a0: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
84b0: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
84c0: 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
84d0: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
84e0: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
84f0: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
8500: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
8510: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
8520: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  er-allocated as 
8530: 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75  described for fu
8540: 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63  nction fts5Struc
8550: 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a  tureDecode() .**
8560: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   above..**.** If
8570: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8580: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
8590: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
85a0: 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65  code left in the
85b0: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61  .** Fts5Index ha
85c0: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
85d0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
85e0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
85f0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
8600: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
8610: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
8620: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8630: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8640: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
8650: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75  ..  if( p->pStru
8660: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ct==0 ){.    p->
8670: 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20 3d  iStructVersion =
8680: 20 66 74 73 35 49 6e 64 65 78 44 61 74 61 56 65   fts5IndexDataVe
8690: 72 73 69 6f 6e 28 70 29 3b 0a 20 20 20 20 69 66  rsion(p);.    if
86a0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
86b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  OK ){.      p->p
86c0: 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
86d0: 75 63 74 75 72 65 52 65 61 64 55 6e 63 61 63 68  uctureReadUncach
86e0: 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ed(p);.    }.  }
86f0: 0a 0a 23 69 66 20 30 0a 20 20 65 6c 73 65 7b 0a  ..#if 0.  else{.
8700: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
8710: 65 20 2a 70 54 65 73 74 20 3d 20 66 74 73 35 53  e *pTest = fts5S
8720: 74 72 75 63 74 75 72 65 52 65 61 64 55 6e 63 61  tructureReadUnca
8730: 63 68 65 64 28 70 29 3b 0a 20 20 20 20 69 66 28  ched(p);.    if(
8740: 20 70 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pTest ){.      
8750: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
8760: 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53  assert_nc( p->pS
8770: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
8780: 3d 70 54 65 73 74 2d 3e 6e 53 65 67 6d 65 6e 74  =pTest->nSegment
8790: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
87a0: 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d  _nc( p->pStruct-
87b0: 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65 73 74 2d 3e  >nLevel==pTest->
87c0: 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLevel );.      
87d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 65 73 74  for(i=0; i<pTest
87e0: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
87f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8800: 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  c( p->pStruct->a
8810: 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d  Level[i].nMerge=
8820: 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69  =pTest->aLevel[i
8830: 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20  ].nMerge );.    
8840: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8850: 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ->pStruct->aLeve
8860: 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70 54 65 73 74  l[i].nSeg==pTest
8870: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
8880: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
8890: 6a 3d 30 3b 20 6a 3c 70 54 65 73 74 2d 3e 61 4c  j=0; j<pTest->aL
88a0: 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 20 6a 2b  evel[i].nSeg; j+
88b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74  +){.          Ft
88c0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
88d0: 6e 74 20 2a 70 31 20 3d 20 26 70 54 65 73 74 2d  nt *p1 = &pTest-
88e0: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b  >aLevel[i].aSeg[
88f0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74  j];.          Ft
8900: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8910: 6e 74 20 2a 70 32 20 3d 20 26 70 2d 3e 70 53 74  nt *p2 = &p->pSt
8920: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8930: 61 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  aSeg[j];.       
8940: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31     assert_nc( p1
8950: 2d 3e 69 53 65 67 69 64 3d 3d 70 32 2d 3e 69 53  ->iSegid==p2->iS
8960: 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  egid );.        
8970: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
8980: 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 70 32 2d 3e  >pgnoFirst==p2->
8990: 70 67 6e 6f 46 69 72 73 74 20 29 3b 0a 20 20 20  pgnoFirst );.   
89a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
89b0: 28 20 70 31 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d  ( p1->pgnoLast==
89c0: 70 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a  p2->pgnoLast );.
89d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
89e0: 7d 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  }.      fts5Stru
89f0: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 54 65  ctureRelease(pTe
8a00: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  st);.    }.  }.#
8a10: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e  endif..  if( p->
8a20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8a30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
8a40: 72 74 28 20 70 2d 3e 69 53 74 72 75 63 74 56 65  rt( p->iStructVe
8a50: 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73  rsion!=0 );.  as
8a60: 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74  sert( p->pStruct
8a70: 21 3d 30 20 29 3b 0a 20 20 66 74 73 35 53 74 72  !=0 );.  fts5Str
8a80: 75 63 74 75 72 65 52 65 66 28 70 2d 3e 70 53 74  uctureRef(p->pSt
8a90: 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
8aa0: 70 2d 3e 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73  p->pStruct;.}..s
8ab0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8ac0: 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
8ad0: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  te(Fts5Index *p)
8ae0: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75  {.  if( p->pStru
8af0: 63 74 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74  ct ){.    fts5St
8b00: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8b10: 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  ->pStruct);.    
8b20: 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 30 3b 0a  p->pStruct = 0;.
8b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
8b40: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
8b50: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
8b60: 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   in index struct
8b70: 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69  ure pStruct. Thi
8b80: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
8b90: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
8ba0: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
8bb0: 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  t() conditions..
8bc0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8bd0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
8be0: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  t fts5StructureC
8bf0: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73  ountSegments(Fts
8c00: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8c10: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
8c20: 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ment = 0;       
8c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8c40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8c50: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  nts */.  if( pSt
8c60: 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
8c70: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8c90: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8ca0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8cb0: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
8cc0: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
8cd0: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
8ce0: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20      nSegment += 
8cf0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8d00: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  iLvl].nSeg;.    
8d10: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8d20: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64  nSegment;.}.#end
8d30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  if..#define fts5
8d40: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
8d50: 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62  Blob(pBuf, pBlob
8d60: 2c 20 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c  , nBlob) {     \
8d70: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66  .  assert( (pBuf
8d80: 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75  )->nSpace>=((pBu
8d90: 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20  f)->n+nBlob) ); 
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8db0: 6d 65 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e  memcpy(&(pBuf)->
8dc0: 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42  p[(pBuf)->n], pB
8dd0: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20  lob, nBlob);    
8de0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42           \.  (pB
8df0: 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b  uf)->n += nBlob;
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69        \.}..#defi
8e30: 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66  ne fts5BufferSaf
8e40: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
8e50: 75 66 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20  uf, iVal) {     
8e60: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28             \.  (
8e70: 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69  pBuf)->n += sqli
8e80: 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
8e90: 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75  (&(pBuf)->p[(pBu
8ea0: 66 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b  f)->n], (iVal));
8eb0: 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
8ec0: 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  Buf)->nSpace>=(p
8ed0: 42 75 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20  Buf)->n );      
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20      \.}.../*.** 
8f00: 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74  Serialize and st
8f10: 6f 72 65 20 74 68 65 20 22 73 74 72 75 63 74 75  ore the "structu
8f20: 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  re" record..**.*
8f30: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8f40: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
8f50: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65  rror code in the
8f60: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
8f70: 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f  t. If an.** erro
8f80: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
8f90: 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
8fa0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
8fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8fc0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
8fd0: 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
8fe0: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
8ff0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
9000: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9010: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66  K ){.    Fts5Buf
9020: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
9030: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
9040: 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65   to serialize re
9050: 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20  cord into */.   
9060: 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9080: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
9090: 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
90a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f   */.    int iCoo
90b0: 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  kie;            
90c0: 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20        /* Cookie 
90d0: 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a  value to store *
90e0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
90f0: 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
9100: 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
9110: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
9120: 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d  ruct) );.    mem
9130: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
9140: 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
9150: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
9160: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
9170: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
9180: 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65  e */.    iCookie
9190: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69   = p->pConfig->i
91a0: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20  Cookie;.    if( 
91b0: 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f  iCookie<0 ) iCoo
91c0: 6b 69 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  kie = 0;..    if
91d0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  ( 0==sqlite3Fts5
91e0: 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
91f0: 63 2c 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39  c, &buf, 4+9+9+9
9200: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
9210: 65 33 46 74 73 35 50 75 74 33 32 28 62 75 66 2e  e3Fts5Put32(buf.
9220: 70 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20  p, iCookie);.   
9230: 20 20 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20     buf.n = 4;.  
9240: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
9250: 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
9260: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  buf, pStruct->nL
9270: 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73  evel);.      fts
9280: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
9290: 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53  dVarint(&buf, pS
92a0: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29  truct->nSegment)
92b0: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
92c0: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
92d0: 6e 74 28 26 62 75 66 2c 20 28 69 36 34 29 70 53  nt(&buf, (i64)pS
92e0: 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
92f0: 6e 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nter);.    }..  
9300: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
9310: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
9320: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
9330: 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20     int iSeg;    
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
9360: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
9370: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74  ents */.      Ft
9380: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9390: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
93a0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
93b0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
93c0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
93d0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
93e0: 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20  ->nMerge);.     
93f0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9400: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9410: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67  &buf, pLvl->nSeg
9420: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9430: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
9440: 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
9450: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
9460: 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
9470: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
9480: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
9490: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
94a0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
94b0: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
94c0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
94d0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
94e0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
94f0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
9500: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
9510: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
9520: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
9530: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
9540: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73  eg[iSeg].pgnoLas
9550: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
9560: 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57  }..    fts5DataW
9570: 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52  rite(p, FTS5_STR
9580: 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75  UCTURE_ROWID, bu
9590: 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
95a0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
95b0: 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  &buf);.  }.}..#i
95c0: 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f 0.static void 
95d0: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
95e0: 72 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66  re(int*,Fts5Buff
95f0: 65 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72  er*,Fts5Structur
9600: 65 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  e*);.static void
9610: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
9620: 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ure(const char *
9630: 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74  zCaption, Fts5St
9640: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9650: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9660: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42  LITE_OK;.  Fts5B
9670: 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
9680: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
9690: 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73  eof(buf));.  fts
96a0: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
96b0: 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  &rc, &buf, pStru
96c0: 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ct);.  fprintf(s
96d0: 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e  tdout, "%s: %s\n
96e0: 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66  ", zCaption, buf
96f0: 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .p);.  fflush(st
9700: 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66  dout);.  fts5Buf
9710: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
9720: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9730: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
9740: 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  re(x,y).#endif..
9750: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
9760: 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53  egmentSize(Fts5S
9770: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
9780: 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e  *pSeg){.  return
9790: 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   1 + pSeg->pgnoL
97a0: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
97b0: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
97c0: 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
97d0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
97e0: 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74   pStruct. Except
97f0: 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e  , promote as man
9800: 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61  y .** segments a
9810: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65  s possible to le
9820: 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66  vel iPromote. If
9830: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
9840: 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75  NULL is .** retu
9850: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
9860: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
9870: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46  rePromoteTo(.  F
9880: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
9890: 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69  nt iPromote,.  i
98a0: 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20  nt szPromote,.  
98b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
98c0: 53 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Struct.){.  int 
98d0: 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74  il, is;.  Fts5St
98e0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f  ructureLevel *pO
98f0: 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
9900: 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b  Level[iPromote];
9910: 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d  ..  if( pOut->nM
9920: 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  erge==0 ){.    f
9930: 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31  or(il=iPromote+1
9940: 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  ; il<pStruct->nL
9950: 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  evel; il++){.   
9960: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
9970: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
9980: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9990: 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
99a0: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74  vl->nMerge ) ret
99b0: 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  urn;.      for(i
99c0: 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  s=pLvl->nSeg-1; 
99d0: 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20  is>=0; is--){.  
99e0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66        int sz = f
99f0: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26  ts5SegmentSize(&
9a00: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b  pLvl->aSeg[is]);
9a10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
9a20: 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75  szPromote ) retu
9a30: 72 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  rn;.        fts5
9a40: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
9a50: 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
9a60: 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  ruct, iPromote, 
9a70: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  1, 1);.        i
9a80: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
9a90: 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  n;.        memcp
9aa0: 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70  y(pOut->aSeg, &p
9ab0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73  Lvl->aSeg[is], s
9ac0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
9ad0: 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20  ureSegment));.  
9ae0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67        pOut->nSeg
9af0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ++;.        pLvl
9b00: 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
9b10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9b20: 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65  *.** A new segme
9b30: 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  nt has just been
9b40: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
9b50: 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20  l iLvl of index 
9b60: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74  structure.** pSt
9b70: 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ruct. This funct
9b80: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69  ion determines i
9b90: 66 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73  f any segments s
9ba0: 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65  hould be promote
9bb0: 64 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74  d.** as a result
9bc0: 2e 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70  . Segments are p
9bd0: 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73  romoted in two s
9be0: 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
9bf0: 20 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d    a) If the segm
9c00: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9c10: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
9c20: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9c30: 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69  ments.**      wi
9c40: 74 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  thin the previou
9c50: 73 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  s populated leve
9c60: 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65  l, it is promote
9c70: 64 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  d to the previou
9c80: 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61  s.**      popula
9c90: 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ted level..**.**
9ca0: 20 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67     b) If the seg
9cb0: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
9cc0: 6e 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  n is larger than
9cd0: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
9ce0: 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74  ent on.**      t
9cf0: 68 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65  he next populate
9d00: 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68  d level, then th
9d10: 61 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20  at segment, and 
9d20: 61 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65  any other adjace
9d30: 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65  nt.**      segme
9d40: 6e 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  nts that are als
9d50: 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  o smaller than t
9d60: 68 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74  he one just writ
9d70: 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20  ten, are .**    
9d80: 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a    promoted. .**.
9d90: 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** If one or mor
9da0: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70  e segments are p
9db0: 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72  romoted, the str
9dc0: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73  ucture object is
9dd0: 20 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72   updated.** to r
9de0: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a  eflect this..*/.
9df0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9e00: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9e10: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9e30: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
9e40: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
9e50: 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a  /* Index level j
9e80: 75 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20  ust updated */. 
9e90: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
9ea0: 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20  pStruct         
9eb0: 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
9ec0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ure */.){.  if( 
9ed0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9ee0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74   ){.    int iTst
9ef0: 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f  ;.    int iPromo
9f00: 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  te = -1;.    int
9f10: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20   szPromote = 0; 
9f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9f30: 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74  omote anything t
9f40: 68 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c  his size or smal
9f50: 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53  ler */.    Fts5S
9f60: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
9f70: 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d  *pSeg;   /* Segm
9f80: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9f90: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65   */.    int szSe
9fa0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
9fb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9fc0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9fd0: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
9fe0: 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d   nSeg = pStruct-
9ff0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
a000: 65 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65  eg;..    if( nSe
a010: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
a020: 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75     pSeg = &pStru
a030: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
a040: 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61  .aSeg[pStruct->a
a050: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
a060: 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d  -1];.    szSeg =
a070: 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f   (1 + pSeg->pgno
a080: 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e  Last - pSeg->pgn
a090: 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  oFirst);..    /*
a0a0: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69   Check for condi
a0b0: 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20  tion (a) */.    
a0c0: 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b  for(iTst=iLvl-1;
a0d0: 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72   iTst>=0 && pStr
a0e0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74  uct->aLevel[iTst
a0f0: 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d  ].nSeg==0; iTst-
a100: 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74  -);.    if( iTst
a110: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
a120: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   i;.      int sz
a130: 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  Max = 0;.      F
a140: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
a150: 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75  l *pTst = &pStru
a160: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
a170: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a180: 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pTst->nMerge==0 
a190: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
a1a0: 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20  ; i<pTst->nSeg; 
a1b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
a1c0: 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65  t sz = pTst->aSe
a1d0: 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20  g[i].pgnoLast - 
a1e0: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
a1f0: 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20  noFirst + 1;.   
a200: 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61       if( sz>szMa
a210: 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a  x ) szMax = sz;.
a220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a230: 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29  ( szMax>=szSeg )
a240: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  {.        /* Con
a250: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72  dition (a) is tr
a260: 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20  ue. Promote the 
a270: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
a280: 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20  n level .       
a290: 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65   ** iLvl to leve
a2a0: 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20  l iTst.  */.    
a2b0: 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69      iPromote = i
a2c0: 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  Tst;.        szP
a2d0: 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a  romote = szMax;.
a2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a2f0: 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69     /* If conditi
a300: 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65  on (a) is not me
a310: 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69 73  t, assume (b) is
a320: 20 74 72 75 65 2e 20 53 74 72 75 63 74 75 72 65   true. Structure
a330: 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20  PromoteTo().    
a340: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ** is a no-op if
a350: 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a   it is not.  */.
a360: 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65      if( iPromote
a370: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f  <0 ){.      iPro
a380: 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  mote = iLvl;.   
a390: 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73     szPromote = s
a3a0: 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zSeg;.    }.    
a3b0: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
a3c0: 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f  moteTo(p, iPromo
a3d0: 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70  te, szPromote, p
a3e0: 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Struct);.  }.}..
a3f0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
a400: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a410: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a420: 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
a430: 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64  end of the .** d
a440: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
a450: 65 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65  e is reached, re
a460: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
a470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a480: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74  5DlidxLvlNext(Ft
a490: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a4a0: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
a4b0: 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  Data = pLvl->pDa
a4c0: 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d  ta;..  if( pLvl-
a4d0: 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >iOff==0 ){.    
a4e0: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
a4f0: 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  of==0 );.    pLv
a500: 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20  l->iOff = 1;.   
a510: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
a520: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
a530: 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76  pData->p[1], pLv
a540: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  l->iLeafPgno);. 
a550: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
a560: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
a570: 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69  pData->p[pLvl->i
a580: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76  Off], (u64*)&pLv
a590: 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  l->iRowid);.    
a5a0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
a5b0: 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20  = pLvl->iOff;.  
a5c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
a5d0: 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66  Off;.    for(iOf
a5e0: 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f  f=pLvl->iOff; iO
a5f0: 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f  ff<pData->nn; iO
a600: 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ff++){.      if(
a610: 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20   pData->p[iOff] 
a620: 29 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a  ) break; .    }.
a630: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44  .    if( iOff<pD
a640: 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  ata->nn ){.     
a650: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20   i64 iVal;.     
a660: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a670: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c   += (iOff - pLvl
a680: 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20  ->iOff) + 1;.   
a690: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
a6a0: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
a6b0: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
a6c0: 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c  &iVal);.      pL
a6d0: 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56  vl->iRowid += iV
a6e0: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
a6f0: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20  iOff = iOff;.   
a700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
a710: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
a720: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a730: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
a740: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
a750: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a760: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a770: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a780: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a790: 49 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e  IterNextR(Fts5In
a7a0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a7b0: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
a7c0: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
a7d0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
a7e0: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
a7f0: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
a800: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
a810: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
a820: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20  dxLvlNext(pLvl) 
a830: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
a840: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
a850: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
a860: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c  lidxIterNextR(p,
a870: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
a880: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
a890: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
a8a0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
a8b0: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
a8c0: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
a8d0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
a8e0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
a8f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
a900: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
a910: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
a920: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
a930: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
a940: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
a950: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
a960: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
a970: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
a980: 61 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  a ) fts5DlidxLvl
a990: 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20  Next(pLvl);.    
a9a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
a9b0: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
a9c0: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
a9d0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a9e0: 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35  idxIterNext(Fts5
a9f0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
aa00: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
aa10: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
aa20: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
aa30: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
aa40: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
aa50: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
aa60: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61  irst argument ha
aa70: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
aa80: 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73  fields set.** as
aa90: 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66   follows. This f
aaa0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20  unction sets up 
aab0: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
aac0: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
aad0: 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f   it.** points to
aae0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
aaf0: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   in the doclist-
ab00: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70  index..**.**   p
ab10: 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69  Data:.**     poi
ab20: 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d  nter to doclist-
ab30: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a  index record, .*
ab40: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
ab50: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
ab60: 64 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  d pIter->iLeafPg
ab70: 6e 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  no is the page n
ab80: 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63  umber the.** doc
ab90: 6c 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74  list is associat
aba0: 65 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65  ed with (the one
abb0: 20 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74   featuring the t
abc0: 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erm)..*/.static 
abd0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
abe0: 72 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78  rFirst(Fts5Dlidx
abf0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ac00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ac10: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
ac20: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44   i++){.    fts5D
ac30: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74  lidxLvlNext(&pIt
ac40: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20  er->aLvl[i]);.  
ac50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  }.  return pIter
ac60: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
ac70: 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
ac80: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
ac90: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
aca0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
acb0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  er){.  return p-
acc0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
acd0: 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  | pIter->aLvl[0]
ace0: 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  .bEof;.}..static
acf0: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
ad00: 74 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65  terLast(Fts5Inde
ad10: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
ad20: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
ad30: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  nt i;..  /* Adva
ad40: 6e 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74  nce each level t
ad50: 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
ad60: 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67   on the last pag
ad70: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74  e */.  for(i=pIt
ad80: 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72  er->nLvl-1; p->r
ad90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ada0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
adb0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
adc0: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
add0: 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[i];.    while(
ade0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
adf0: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
ae00: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
ae10: 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ;..    if( i>0 )
ae20: 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
ae30: 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26  xLvl *pChild = &
ae40: 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20  pLvl[-1];.      
ae50: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ae60: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a  pChild->pData);.
ae70: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68        memset(pCh
ae80: 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ild, 0, sizeof(F
ae90: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
aea0: 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61       pChild->pDa
aeb0: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
aec0: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
aed0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
aee0: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
aef0: 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  i-1, pLvl->iLeaf
af00: 50 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20  Pgno).      );. 
af10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
af20: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
af30: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
af40: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
af50: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
af60: 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
af70: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76   int fts5DlidxLv
af80: 6c 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c  lPrev(Fts5DlidxL
af90: 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74  vl *pLvl){.  int
afa0: 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f   iOff = pLvl->iO
afb0: 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
afc0: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
afd0: 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c    if( iOff<=pLvl
afe0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
aff0: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
b000: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b010: 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44  u8 *a = pLvl->pD
b020: 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20  ata->p;.    i64 
b030: 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iVal;.    int iL
b040: 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69  imit;.    int ii
b050: 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20  ;.    int nZero 
b060: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72  = 0;..    /* Cur
b070: 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e  rently iOff poin
b080: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
b090: 62 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74  byte of a varint
b0a0: 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20  . This block .  
b0b0: 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20    ** decrements 
b0c0: 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f  iOff until it po
b0d0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
b0e0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72  t byte of the pr
b0f0: 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76  evious .    ** v
b100: 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61  arint. Taking ca
b110: 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61  re not to read a
b120: 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ny memory locati
b130: 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20  ons that occur. 
b140: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65     ** before the
b150: 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72   buffer in memor
b160: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69  y.  */.    iLimi
b170: 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f  t = (iOff>9 ? iO
b180: 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66  ff-9 : 0);.    f
b190: 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e  or(iOff--; iOff>
b1a0: 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b  iLimit; iOff--){
b1b0: 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f  .      if( (a[iO
b1c0: 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30  ff-1] & 0x80)==0
b1d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
b1e0: 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69  .    fts5GetVari
b1f0: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
b200: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70  4*)&iVal);.    p
b210: 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  Lvl->iRowid -= i
b220: 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  Val;.    pLvl->i
b230: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
b240: 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72   /* Skip backwar
b250: 64 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30  ds past any 0x00
b260: 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20   varints. */.   
b270: 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20   for(ii=iOff-1; 
b280: 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ii>=pLvl->iFirst
b290: 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78  Off && a[ii]==0x
b2a0: 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  00; ii--){.     
b2b0: 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a   nZero++;.    }.
b2c0: 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c      if( ii>=pLvl
b2d0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28  ->iFirstOff && (
b2e0: 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b  a[ii] & 0x80) ){
b2f0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79  .      /* The by
b300: 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  te immediately b
b310: 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30  efore the last 0
b320: 78 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65  x00 byte has the
b330: 20 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20   0x80 bit.      
b340: 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c  ** set. So the l
b350: 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79  ast 0x00 is only
b360: 20 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74   a varint 0 if t
b370: 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20  here are 8 more 
b380: 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79  0x80.      ** by
b390: 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d  tes before a[ii]
b3a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  . */.      int b
b3b0: 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
b3c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b3d0: 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e  f last 0x00 coun
b3e0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
b3f0: 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46  (ii-8)>=pLvl->iF
b400: 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20  irstOff ){.     
b410: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
b420: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20    for(j=1; j<=8 
b430: 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78  && (a[ii-j] & 0x
b440: 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20  80); j++);.     
b450: 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29     bZero = (j>8)
b460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b470: 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e  if( bZero==0 ) n
b480: 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Zero--;.    }.  
b490: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
b4a0: 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  o -= nZero;.    
b4b0: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
b4c0: 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a  f - nZero;.  }..
b4d0: 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62    return pLvl->b
b4e0: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Eof;.}..static i
b4f0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
b500: 50 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20  PrevR(Fts5Index 
b510: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
b520: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c  r *pIter, int iL
b530: 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  vl){.  Fts5Dlidx
b540: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
b550: 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a  er->aLvl[iLvl];.
b560: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
b570: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20  pIter->nLvl );. 
b580: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76   if( fts5DlidxLv
b590: 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20  lPrev(pLvl) ){. 
b5a0: 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20     if( (iLvl+1) 
b5b0: 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b  < pIter->nLvl ){
b5c0: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
b5d0: 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74  IterPrevR(p, pIt
b5e0: 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20  er, iLvl+1);.   
b5f0: 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62     if( pLvl[1].b
b600: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
b610: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
b620: 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
b630: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
b640: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
b650: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
b660: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61         pLvl->pDa
b670: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b680: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
b690: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
b6a0: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
b6b0: 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e  , iLvl, pLvl[1].
b6c0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
b6d0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
b6e0: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
b6f0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
b700: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
b710: 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20  xt(pLvl)==0 );. 
b720: 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62           pLvl->b
b730: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Eof = 0;.       
b740: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b750: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b760: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
b770: 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  of;.}.static int
b780: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b790: 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ev(Fts5Index *p,
b7a0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
b7b0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
b7c0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b7d0: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29  evR(p, pIter, 0)
b7e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
b7f0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
b800: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
b810: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73  allocated by fts
b820: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29  5DlidxIterInit()
b830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b840: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
b850: 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ee(Fts5DlidxIter
b860: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
b870: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
b880: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
b890: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
b8a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
b8b0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
b8c0: 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61  r->aLvl[i].pData
b8d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
b8e0: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
b8f0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
b900: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66  Fts5DlidxIter *f
b910: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
b920: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
b930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b940: 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b      /* Fts5 Back
b950: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
b960: 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ithin */.  int b
b970: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
b980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
b990: 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20  ue for ORDER BY 
b9a0: 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ASC */.  int iSe
b9b0: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
b9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
b9d0: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
b9e0: 69 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20  iLeafPg         
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ba00: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
ba10: 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f  to load dlidx fo
ba20: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  r */.){.  Fts5Dl
ba30: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  idxIter *pIter =
ba40: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
ba50: 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
ba60: 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
ba70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
ba80: 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
ba90: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
baa0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74  zeof(Fts5DlidxIt
bab0: 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66  er) + i * sizeof
bac0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a  (Fts5DlidxLvl);.
bad0: 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
bae0: 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e  r *pNew;..    pN
baf0: 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49  ew = (Fts5DlidxI
bb00: 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
bb10: 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74  lloc(pIter, nByt
bb20: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
bb30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
bb40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
bb50: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
bb60: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
bb70: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
bb80: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
bb90: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
bba0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
bbb0: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
bbc0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
bbd0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
bbe0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
bbf0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
bc00: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
bc10: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
bc20: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
bc30: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
bc40: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
bc50: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
bc60: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
bc70: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
bc80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
bc90: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
bca0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
bcb0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bcc0: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
bcd0: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
bce0: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
bcf0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
bd00: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
bd10: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
bd20: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
bd30: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
bd40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bd50: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
bd60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
bd70: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
bd80: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
bd90: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
bda0: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
bdb0: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
bdc0: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
bdd0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
bde0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
bdf0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
be00: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
be10: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
be20: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
be30: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
be40: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
be50: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iLeafPgno;.}../*
be60: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
be70: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
be80: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
be90: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
bea0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
beb0: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
bec0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bee0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
bef0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
bf00: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
bf10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
bf20: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
bf30: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
bf40: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
bf50: 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75  Leaf;.  Fts5Stru
bf60: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
bf70: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
bf80: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
bf90: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
bfa0: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
bfb0: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
bfc0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
bfd0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  ){.    pIter->pL
bfe0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
bff0: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
c000: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
c010: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
c020: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
c030: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
c040: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c050: 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  af = fts5LeafRea
c060: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
c070: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
c080: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
c090: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
c0a0: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
c0b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c0c0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65  f = 0;.  }.  pLe
c0d0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
c0e0: 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20  f;..  if( pLeaf 
c0f0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  ){.    pIter->iP
c100: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
c110: 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28  >szLeaf;.    if(
c120: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
c130: 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  ess(pLeaf) ){.  
c140: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c150: 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
c160: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
c170: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
c180: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
c190: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
c1a0: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50  eaf->p[pIter->iP
c1b0: 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20  gidxOff],.      
c1c0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c1d0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29  fDoclist.      )
c1e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c1f0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
c200: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
c210: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
c220: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
c230: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
c240: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
c250: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c260: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
c270: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c280: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
c290: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
c2a0: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
c2b0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
c2c0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
c2d0: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
c2e0: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
c2f0: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
c300: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
c310: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
c320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c330: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
c340: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
c350: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
c360: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
c370: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
c380: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
c390: 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b  nt32(p, n, nSz);
c3a0: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
c3b0: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
c3c0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
c3d0: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
c3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c3f0: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
c400: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
c410: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
c420: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
c430: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
c440: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
c450: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
c460: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
c470: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
c480: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
c490: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
c4a0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
c4b0: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
c4c0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
c4d0: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
c4e0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
c4f0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
c500: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c510: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
c520: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
c530: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
c540: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
c550: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
c560: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
c570: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
c580: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c590: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
c5a0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
c5b0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
c5c0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
c5d0: 0a 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  .    ASSERT_SZLE
c5e0: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
c5f0: 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
c600: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
c610: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
c620: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  NE ){.      int 
c630: 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72  iEod = MIN(pIter
c640: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c  ->iEndofDoclist,
c650: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
c660: 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  zLeaf);.      pI
c670: 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20  ter->bDel = 0;. 
c680: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
c690: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
c6a0: 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74  iOff<iEod && pIt
c6b0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
c6c0: 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
c6d0: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31   pIter->bDel = 1
c6e0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b  ;.        iOff++
c6f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
c700: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
c710: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
c720: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c730: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31   pIter->nPos = 1
c740: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
c750: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
c760: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  e{.          pIt
c770: 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20  er->nPos = 0;.  
c780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c7a0: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20   int nSz;.      
c7b0: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
c7c0: 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  t32(pIter->pLeaf
c7d0: 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b  ->p, iOff, nSz);
c7e0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
c7f0: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
c800: 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  01);.      pIter
c810: 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b  ->nPos = nSz>>1;
c820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
c830: 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30  ( pIter->nPos>=0
c840: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   );.    }.    pI
c850: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c860: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a   = iOff;.  }.}..
c870: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c880: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
c890: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
c8a0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c8b0: 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  r){.  u8 *a = pI
c8c0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
c8d0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
c8e0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
c8f0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
c900: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c910: 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f  fset;..  ASSERT_
c920: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
c930: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69  >pLeaf);.  if( i
c940: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
c950: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
c960: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c970: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
c980: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
c990: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
c9a0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c9b0: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
c9c0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
c9d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c9e0: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
c9f0: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
ca00: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
ca10: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
ca20: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
ca30: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
ca40: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70  er->iRowid);.  p
ca50: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ca60: 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  t = iOff;.}../*.
ca70: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
ca80: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
ca90: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
caa0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
cab0: 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69   the .** "nSuffi
cac0: 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65  x" field of a te
cad0: 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72  rm. Function par
cae0: 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e  ameter nKeep con
caf0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a  tains the value.
cb00: 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66  ** of the "nPref
cb10: 69 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68  ix" field (if th
cb20: 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74  ere was one - it
cb30: 20 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20   is passed 0 if 
cb40: 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  this is.** the f
cb50: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  irst term in the
cb60: 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a   segment)..**.**
cb70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
cb80: 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  opulates:.**.** 
cb90: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65    Fts5SegIter.te
cba0: 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  rm.**   Fts5SegI
cbb0: 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  ter.rowid.**.** 
cbc0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20  accordingly and 
cbd0: 6c 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49  leaves (Fts5SegI
cbe0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29  ter.iLeafOffset)
cbf0: 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74   set to the cont
cc00: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  ent of.** the fi
cc10: 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  rst position lis
cc20: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
cc30: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
cc40: 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28  o document .** (
cc50: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
cc60: 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
cc70: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
cc80: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
cc90: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
cca0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
ccb0: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
ccc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
ccd0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
cce0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
ccf0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
cd00: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
cd10: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
cd20: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
cd30: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
cd60: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
cd70: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
cd80: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
cd90: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66  nNew);.  if( iOf
cda0: 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c  f+nNew>pIter->pL
cdb0: 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 70  eaf->nn ){.    p
cdc0: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
cdd0: 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  UPT;.    return;
cde0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 74 65  .  }.  pIter->te
cdf0: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
ce00: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
ce10: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
ce20: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
ce30: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f   &a[iOff]);.  iO
ce40: 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49  ff += nNew;.  pI
ce50: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
ce60: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70  fset = iOff;.  p
ce70: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
ce80: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
ce90: 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65 72 2d  afPgno;.  pIter-
cea0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
ceb0: 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65  Off;..  if( pIte
cec0: 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d 70 49  r->iPgidxOff>=pI
ced0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29  ter->pLeaf->nn )
cee0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
cef0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
cf00: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
cf10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
cf20: 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 70 49  t nExtra;.    pI
cf30: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b  ter->iPgidxOff +
cf40: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
cf50: 32 28 26 61 5b 70 49 74 65 72 2d 3e 69 50 67 69  2(&a[pIter->iPgi
cf60: 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61 29 3b  dxOff], nExtra);
cf70: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
cf80: 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 45 78  ofDoclist += nEx
cf90: 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  tra;.  }..  fts5
cfa0: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
cfb0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73  (p, pIter);.}..s
cfc0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cfd0: 65 67 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  egIterNext(Fts5I
cfe0: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
cff0: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
d000: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d010: 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 28  terNext_Reverse(
d020: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
d030: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
d040: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d050: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e  5SegIterNext_Non
d060: 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  e(Fts5Index*, Ft
d070: 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a  s5SegIter*, int*
d080: 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
d090: 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
d0a0: 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
d0b0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
d0c0: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
d0d0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
d0e0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
d0f0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e  ){.    pIter->xN
d100: 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65  ext = fts5SegIte
d110: 72 4e 65 78 74 5f 52 65 76 65 72 73 65 3b 0a 20  rNext_Reverse;. 
d120: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43   }else if( p->pC
d130: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
d140: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
d150: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78   ){.    pIter->x
d160: 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74  Next = fts5SegIt
d170: 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d  erNext_None;.  }
d180: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
d190: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
d1a0: 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a  IterNext;.  }.}.
d1b0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
d1c0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
d1d0: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
d1e0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
d1f0: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
d200: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
d210: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
d220: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
d230: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
d240: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
d250: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
d260: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d270: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
d280: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
d290: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
d2a0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
d2b0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
d2c0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
d2d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d2e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
d2f0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
d300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d310: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
d320: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
d350: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
d360: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
d370: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
d380: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
d390: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
d3a0: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
d3b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
d3c0: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
d3d0: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
d3e0: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
d3f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
d400: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
d410: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
d420: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
d430: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
d440: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
d450: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
d460: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
d470: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
d480: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
d490: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
d4a0: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
d4b0: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
d4c0: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
d4d0: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
d4e0: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
d4f0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
d500: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
d510: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
d520: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
d530: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
d540: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
d550: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
d560: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
d570: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d580: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
d590: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
d5a0: 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35 53 65  er));.    fts5Se
d5b0: 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
d5c0: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65  pIter);.    pIte
d5d0: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
d5e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d5f0: 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Pgno = pSeg->pgn
d600: 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74  oFirst-1;.    ft
d610: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
d620: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
d630: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
d640: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d650: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d660: 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73 65  et = 4;.    asse
d670: 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c  rt_nc( pIter->pL
d680: 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20  eaf->nn>4 );.   
d690: 20 61 73 73 65 72 74 28 20 66 74 73 35 4c 65 61   assert( fts5Lea
d6a0: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49  fFirstTermOff(pI
d6b0: 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29  ter->pLeaf)==4 )
d6c0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  ;.    pIter->iPg
d6d0: 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  idxOff = pIter->
d6e0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b  pLeaf->szLeaf+1;
d6f0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d700: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
d710: 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  r, 0);.    fts5S
d720: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
d730: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
d740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d750: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
d760: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
d770: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
d780: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
d790: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
d7a0: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
d7b0: 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67  _QUERY_DESC flag
d7c0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
d7d0: 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61  iterator is in a
d7e0: 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20  n unusual state 
d7f0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d800: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68  on is called: th
d810: 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  e.** Fts5SegIter
d820: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72  .iLeafOffset var
d830: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
d840: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
d850: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
d860: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
d870: 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74  size field for t
d880: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
d890: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
d8a0: 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49  age..** Fts5SegI
d8b0: 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74  ter.rowid is set
d8c0: 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62  , but nPos and b
d8d0: 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a  Del are not..**.
d8e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d8f0: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74   advances the it
d900: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
d910: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
d920: 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e  last .** relevan
d930: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
d940: 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  age and, if nece
d950: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
d960: 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69  es the .** aRowi
d970: 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52  dOffset[] and iR
d980: 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61  owidOffset varia
d990: 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f  bles. At this po
d9a0: 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  int the iterator
d9b0: 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65  .** is in its re
d9c0: 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74  gular state - Ft
d9d0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
d9e0: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
d9f0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
da00: 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
da10: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61  n list content a
da20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
da30: 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  aid rowid..*/.st
da40: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
da50: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
da60: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
da70: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
da80: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44  pIter){.  int eD
da90: 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
daa0: 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69  ig->eDetail;.  i
dab0: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
dac0: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
dad0: 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c  nt i = pIter->iL
dae0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  eafOffset;.  u8 
daf0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
db00: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77  f->p;.  int iRow
db10: 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  idOffset = 0;.. 
db20: 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45   if( n>pIter->iE
db30: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
db40: 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45     n = pIter->iE
db50: 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d  ndofDoclist;.  }
db60: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
db70: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
db80: 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  f);.  while( 1 )
db90: 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
dba0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65   = 0;..    if( e
dbb0: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
dbc0: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
dbd0: 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20    /* todo */.   
dbe0: 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b     if( i<n && a[
dbf0: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
dc00: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   i++;.        if
dc10: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
dc20: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) i++;.      }.
dc30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc40: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
dc50: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
dc60: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50     i += fts5GetP
dc70: 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d  oslistSize(&a[i]
dc80: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
dc90: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50  );.      i += nP
dca0: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  os;.    }.    if
dcb0: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
dcc0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
dcd0: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
dce0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
dcf0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
dd00: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
dd10: 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  /* If necessary,
dd20: 20 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d   grow the pIter-
dd30: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20  >aRowidOffset[] 
dd40: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66  array. */.    if
dd50: 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d  ( iRowidOffset>=
dd60: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
dd70: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
dd80: 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e   nNew = pIter->n
dd90: 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b  RowidOffset + 8;
dda0: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
ddb0: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
ddc0: 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e  _realloc(pIter->
ddd0: 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e  aRowidOffset, nN
dde0: 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ew*sizeof(int));
ddf0: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
de00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
de10: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
de20: 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  EM;.        brea
de30: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
de40: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
de50: 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  fset = aNew;.   
de60: 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64     pIter->nRowid
de70: 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  Offset = nNew;. 
de80: 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
de90: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52  >aRowidOffset[iR
dea0: 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20  owidOffset++] = 
deb0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
dec0: 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  et;.    pIter->i
ded0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a  LeafOffset = i;.
dee0: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f    }.  pIter->iRo
def0: 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  widOffset = iRow
df00: 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35  idOffset;.  fts5
df10: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
df20: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
df30: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
df40: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
df50: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
df60: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
df70: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
df80: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
df90: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
dfa0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
dfb0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
dfc0: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
dfd0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
dfe0: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
dff0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
e000: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
e010: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
e020: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e030: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
e040: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
e050: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
e060: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
e070: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
e080: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
e090: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
e0a0: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
e0b0: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
e0c0: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e     pIter->pSeg->
e0d0: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
e0e0: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
e0f0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
e100: 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c  .      /* iTermL
e110: 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65  eafOffset may be
e120: 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66   equal to szLeaf
e130: 20 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   if the term is 
e140: 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
e150: 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70  * thing on the p
e160: 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66  age - i.e. the f
e170: 69 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e  irst rowid is on
e180: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
e190: 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  age..      ** In
e1a0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
e1b0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
e1c0: 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  , this iterator 
e1d0: 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20  is at EOF. */.  
e1e0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
e1f0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
e200: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
e210: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e220: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
e230: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
e240: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
e250: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a  fOffset<pNew->sz
e260: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e270: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
e280: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
e290: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e2a0: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
e2b0: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
e2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e2d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
e2e0: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
e2f0: 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
e300: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
e310: 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
e320: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
e330: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
e340: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
e350: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
e360: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e370: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
e380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e390: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
e3a0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
e3b0: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
e3c0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
e3d0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
e3e0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
e3f0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
e400: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  fts5GetVarint(a,
e410: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e420: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e430: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
e440: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
e450: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
e460: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e470: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
e480: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
e490: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
e4a0: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
e4b0: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66  eaf->nn+1;.    f
e4c0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
e4d0: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
e4e0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
e4f0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
e500: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
e510: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e520: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
e530: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
e540: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
e550: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
e560: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
e570: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
e580: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
e590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
e5a0: 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
e5b0: 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ty(Fts5Index *p,
e5c0: 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
e5d0: 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
e5e0: 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
e5f0: 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69  >aSeg[pIter->aFi
e600: 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a  rst[1].iFirst];.
e610: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
e620: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
e630: 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
e640: 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a  g->nPos==0);.}..
e650: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
e660: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
e670: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a  the next entry..
e680: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  **.** This versi
e690: 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65  on of fts5SegIte
e6a0: 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20  rNext() is only 
e6b0: 75 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20  used by reverse 
e6c0: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
e6d0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
e6e0: 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73  gIterNext_Revers
e6f0: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
e700: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e710: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
e720: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
e730: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
e740: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
e750: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
e760: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
e770: 20 2a 70 62 55 6e 75 73 65 64 20 20 20 20 20 20   *pbUnused      
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e790: 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  Unused */.){.  a
e7a0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
e7b0: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e7c0: 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20  ER_REVERSE );.  
e7d0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
e7e0: 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
e7f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 62   UNUSED_PARAM(pb
e800: 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69 66 28 20  Unused);..  if( 
e810: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e820: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 75 38 20  set>0 ){.    u8 
e830: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
e840: 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 69 4f  f->p;.    int iO
e850: 66 66 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c  ff;.    i64 iDel
e860: 74 61 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta;..    pIter->
e870: 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a  iRowidOffset--;.
e880: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e890: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
e8a0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74  aRowidOffset[pIt
e8b0: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
e8c0: 5d 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ];.    fts5SegIt
e8d0: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
e8e0: 74 65 72 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d  ter);.    iOff =
e8f0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e900: 73 65 74 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  set;.    if( p->
e910: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
e920: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
e930: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  NE ){.      iOff
e940: 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b   += pIter->nPos;
e950: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 47  .    }.    fts5G
e960: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
e970: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
e980: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
e990: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
e9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
e9b0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
e9c0: 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
e9d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
e9e0: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
e9f0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
ea00: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
ea10: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  his version of f
ea20: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29  ts5SegIterNext()
ea30: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
ea40: 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 61 6e 64   detail=none and
ea50: 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72   the.** iterator
ea60: 20 69 73 20 6e 6f 74 20 61 20 72 65 76 65 72 73   is not a revers
ea70: 65 20 64 69 72 65 63 74 69 6f 6e 20 69 74 65 72  e direction iter
ea80: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
ea90: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
eaa0: 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20 46 74 73  Next_None(.  Fts
eab0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ead0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
eae0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
eaf0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
eb00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
eb10: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
eb20: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  */.  int *pbNewT
eb30: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
eb40: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
eb50: 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f   for new term */
eb60: 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
eb70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
eb80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
eb90: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
eba0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
ebb0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d  GITER_REVERSE)==
ebc0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ebd0: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
ebe0: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
ebf0: 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53 53 45 52  NONE );..  ASSER
ec00: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
ec10: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66  r->pLeaf);.  iOf
ec20: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
ec30: 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 4e 65  Offset;..  /* Ne
ec40: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
ec50: 68 65 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  he next page */.
ec60: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65    if( pIter->pSe
ec70: 67 20 26 26 20 69 4f 66 66 3e 3d 70 49 74 65 72  g && iOff>=pIter
ec80: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
ec90: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
eca0: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
ecb0: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ter);.    if( p-
ecc0: 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c  >rc || pIter->pL
ecd0: 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
ece0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
ecf0: 69 64 20 3d 20 30 3b 0a 20 20 20 20 69 4f 66 66  id = 0;.    iOff
ed00: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 4;.  }..  if(
ed10: 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e 69 45 6e   iOff<pIter->iEn
ed20: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
ed30: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
ed40: 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  is on the curren
ed50: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 36  t page */.    i6
ed60: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 4f  4 iDelta;.    iO
ed70: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
ed80: 35 47 65 74 56 61 72 69 6e 74 28 26 70 49 74 65  5GetVarint(&pIte
ed90: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  r->pLeaf->p[iOff
eda0: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
edb0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
edc0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
edd0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
ede0: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
edf0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 74 65   }else if( (pIte
ee00: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
ee10: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
ee20: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
ee30: 49 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20 20  Iter->pSeg ){.  
ee40: 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
ee50: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  0;.      if( iOf
ee60: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
ee70: 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70  TermOff(pIter->p
ee80: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
ee90: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
eea0: 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
eeb0: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  >pLeaf->p[iOff],
eec0: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d   nKeep);.      }
eed0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
eee0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
eef0: 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
ef00: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
ef10: 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Iter, nKeep);.  
ef20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
ef30: 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
ef40: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   0;.      const 
ef50: 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b  char *zTerm = 0;
ef60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74  .      int nList
ef70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
ef80: 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
ef90: 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20  p->pHash);.     
efa0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
efb0: 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61  ScanEntry(p->pHa
efc0: 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69  sh, &zTerm, &pLi
efd0: 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
efe0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
eff0: 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65  ) goto next_none
f000: 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65  _eof;.      pIte
f010: 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75  r->pLeaf->p = (u
f020: 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  8*)pList;.      
f030: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
f040: 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
f050: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
f060: 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  Leaf = nList;.  
f070: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
f080: 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74  fDoclist = nList
f090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f0a0: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
f0b0: 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74 65 72 6d  >rc,&pIter->term
f0c0: 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
f0d0: 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d  erm), (u8*)zTerm
f0e0: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
f0f0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
f100: 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73  s5GetVarint(pLis
f110: 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  t, (u64*)&pIter-
f120: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  >iRowid);.    }.
f130: 0a 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65  .    if( pbNewTe
f140: 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20  rm ) *pbNewTerm 
f150: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
f160: 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65    goto next_none
f170: 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  _eof;.  }..  fts
f180: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
f190: 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 72  (p, pIter);..  r
f1a0: 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f 6e  eturn;. next_non
f1b0: 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44 61 74  e_eof:.  fts5Dat
f1c0: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
f1d0: 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
f1e0: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a  >pLeaf = 0;.}...
f1f0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
f200: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
f210: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
f220: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
f230: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
f240: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
f250: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
f260: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20   error code. It 
f270: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
f280: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
f290: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
f2a0: 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61  eaches EOF. If a
f2b0: 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
f2c0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
f2d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
f2e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f2f0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
f300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f310: 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20  5SegIterNext(.  
f320: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
f350: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
f360: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
f370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f380: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
f390: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  ce */.  int *pbN
f3a0: 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
f3b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f3c0: 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d  Set for new term
f3d0: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74   */.){.  Fts5Dat
f3e0: 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
f3f0: 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69  ->pLeaf;.  int i
f400: 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77 54  Off;.  int bNewT
f410: 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  erm = 0;.  int n
f420: 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75 38 20 2a  Keep = 0;.  u8 *
f430: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61  a;.  int n;..  a
f440: 73 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d  ssert( pbNewTerm
f450: 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72  ==0 || *pbNewTer
f460: 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
f470: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
f480: 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
f490: 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a  IL_NONE );..  /*
f4a0: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
f4b0: 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74  end of the posit
f4c0: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20  ion list within 
f4d0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f4e0: 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c 65 61 66  . */.  a = pLeaf
f4f0: 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c 65 61 66  ->p;.  n = pLeaf
f500: 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53  ->szLeaf;..  ASS
f510: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
f520: 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70  eaf);.  iOff = p
f530: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f540: 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b  t + pIter->nPos;
f550: 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29  ..  if( iOff<n )
f560: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78  {.    /* The nex
f570: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
f580: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
f590: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  */.    assert_nc
f5a0: 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69  ( iOff<=pIter->i
f5b0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a  EndofDoclist );.
f5c0: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49      if( iOff>=pI
f5d0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f5e0: 73 74 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77  st ){.      bNew
f5f0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
f600: 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65  if( iOff!=fts5Le
f610: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
f620: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
f630: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f640: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
f650: 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
f660: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
f670: 20 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a      u64 iDelta;.
f680: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
f690: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
f6a0: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44  nt(&a[iOff], &iD
f6b0: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74  elta);.      pIt
f6c0: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
f6d0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65  elta;.      asse
f6e0: 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20  rt_nc( iDelta>0 
f6f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  );.    }.    pIt
f700: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f710: 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65  = iOff;..  }else
f720: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
f730: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
f740: 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a   u8 *pList = 0;.
f750: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f760: 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69  zTerm = 0;.    i
f770: 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20  nt nList = 0;.  
f780: 20 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72    assert( (pIter
f790: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f7a0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
f7b0: 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a  || pbNewTerm );.
f7c0: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65      if( 0==(pIte
f7d0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
f7e0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
f7f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f800: 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
f810: 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  t(p->pHash);.   
f820: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
f830: 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
f840: 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70  Hash, &zTerm, &p
f850: 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
f860: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
f870: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
f880: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
f890: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
f8a0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f8b0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
f8c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
f8d0: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
f8e0: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
f8f0: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c  ->pLeaf->nn = nL
f900: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
f910: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
f920: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
f930: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
f940: 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20  ist = nList+1;. 
f950: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
f960: 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
f970: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
f980: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
f990: 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75  m),.          (u
f9a0: 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
f9b0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f9c0: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
f9d0: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
f9e0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
f9f0: 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65  ;.      *pbNewTe
fa00: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rm = 1;.    }.  
fa10: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20  }else{.    iOff 
fa20: 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74  = 0;.    /* Next
fa30: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
fa40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
fa50: 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  e */.    while( 
fa60: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
fa70: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
fa80: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
fa90: 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49        pLeaf = pI
faa0: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
fab0: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
fac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53   break;.      AS
fad0: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
fae0: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
faf0: 20 28 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61   (iOff = fts5Lea
fb00: 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
fb10: 4c 65 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70  Leaf)) && iOff<p
fb20: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
fb30: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
fb40: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
fb50: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
fb60: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
fb70: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
fb80: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
fb90: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
fba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
fbb0: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
fbc0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
fbd0: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
fbe0: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
fbf0: 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69  af + fts5GetVari
fc00: 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20  nt32(.          
fc10: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
fc20: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49  eaf->szLeaf], pI
fc30: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
fc40: 73 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  st.          );.
fc50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fc60: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
fc70: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
fc80: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
fc90: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
fca0: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
fcb0: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
fcc0: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
fcd0: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
fce0: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f  eaf->szLeaf], iO
fcf0: 66 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ff.        );.  
fd00: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
fd10: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
fd20: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
fd30: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
fd40: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 62 4e  iOff;.        bN
fd50: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
fd60: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
fd70: 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  _nc( iOff<pLeaf-
fd80: 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  >szLeaf );.     
fd90: 20 69 66 28 20 69 4f 66 66 3e 70 4c 65 61 66 2d   if( iOff>pLeaf-
fda0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fdb0: 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
fdc0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
fdd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
fde0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fdf0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74   Check if the it
fe00: 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74  erator is now at
fe10: 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74   EOF. If so, ret
fe20: 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
fe30: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
fe40: 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4e 65 77   ){.    if( bNew
fe50: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66  Term ){.      if
fe60: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
fe70: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
fe80: 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20  ETERM ){.       
fe90: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
fea0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
feb0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
fec0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
fed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
fee0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
fef0: 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65  rm(p, pIter, nKe
ff00: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ep);.        fts
ff10: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
ff20: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
ff30: 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
ff40: 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
ff50: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ff60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
ff70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
ff80: 75 6c 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63  uld be done by c
ff90: 61 6c 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74  alling fts5SegIt
ffa0: 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75  erLoadNPos(). Bu
ffb0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  t.      ** this 
ffc0: 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75  block is particu
ffd0: 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63  larly performanc
ffe0: 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65  e critical, so e
fff0: 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
10000 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  ** code is inlin
10010 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ed. .      **.  
10020 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77      ** Later: Sw
10030 69 74 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66  itched back to f
10040 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
10050 6f 73 28 29 20 62 65 63 61 75 73 65 20 69 74 20  os() because it 
10060 73 75 70 70 6f 72 74 73 0a 20 20 20 20 20 20 2a  supports.      *
10070 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f  * detail=none mo
10080 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20  de. Not ideal.. 
10090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
100a0 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61 73 73  t nSz;.      ass
100b0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
100c0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
100d0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c  ssert( pIter->iL
100e0 65 61 66 4f 66 66 73 65 74 3c 3d 70 49 74 65 72  eafOffset<=pIter
100f0 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 3b 0a 20  ->pLeaf->nn );. 
10100 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
10110 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e  Varint32(pIter->
10120 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d  pLeaf->p, pIter-
10130 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53  >iLeafOffset, nS
10140 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  z);.      pIter-
10150 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30  >bDel = (nSz & 0
10160 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49  x0001);.      pI
10170 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
10180 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  >1;.      assert
10190 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73  _nc( pIter->nPos
101a0 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  >=0 );.    }.  }
101b0 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .}..#define SWAP
101c0 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54  VAL(T, a, b) { T
101d0 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62   tmp; tmp=a; a=b
101e0 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66  ; b=tmp; }..#def
101f0 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69  ine fts5IndexSki
10200 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29  pVarint(a, iOff)
10210 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a   {            \.
10220 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66    int iEnd = iOf
10230 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20 20  f+9;            
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b    \.  while( (a[
10260 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20  iOff++] & 0x80) 
10270 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20  && iOff<iEnd ); 
10280 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
10290 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
102a0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
102b0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
102c0 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74  wid in a doclist
102d0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
102e0 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74 65 72  on sets the iter
102f0 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20  ator up so that 
10300 69 74 65 72 61 74 65 73 20 69 6e 20 72 65 76 65  iterates in reve
10310 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67  rse order throug
10320 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74  h.** the doclist
10330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10340 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
10350 72 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rse(Fts5Index *p
10360 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
10370 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69  Iter){.  Fts5Dli
10380 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
10390 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a   pIter->pDlidx;.
103a0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73    Fts5Data *pLas
103b0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e  t = 0;.  int pgn
103c0 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66  oLast = 0;..  if
103d0 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( pDlidx ){.    
103e0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74  int iSegid = pIt
103f0 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
10400 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d  ;.    pgnoLast =
10410 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
10420 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
10430 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61  pLast = fts5Data
10440 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
10450 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
10460 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20  d, pgnoLast));. 
10470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35   }else{.    Fts5
10480 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
10490 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20  ter->pLeaf;     
104a0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
104b0 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20  eaf data */..   
104c0 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46   /* Currently, F
104d0 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
104e0 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f  Offset points to
104f0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
10500 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  of.    ** positi
10510 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on-list content 
10520 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
10530 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75  rowid. Back it u
10540 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20  p so that it.   
10550 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   ** points to th
10560 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
10570 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
10580 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20  e field. */.    
10590 69 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20  int iPoslist;.  
105a0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
105b0 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
105c0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
105d0 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d        iPoslist =
105e0 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
105f0 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c  fOffset;.    }el
10600 73 65 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69  se{.      iPosli
10610 73 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  st = 4;.    }.  
10620 20 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56    fts5IndexSkipV
10630 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20  arint(pLeaf->p, 
10640 69 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70  iPoslist);.    p
10650 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10660 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20  t = iPoslist;.. 
10670 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f     /* If this co
10680 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
10690 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74  then the largest
106a0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
106b0 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65  urrent.    ** te
106c0 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74  rm may not be st
106d0 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
106e0 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61  ent page. So sea
106f0 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20  rch forward to. 
10700 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20     ** see where 
10710 73 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c  said rowid reall
10720 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66  y is.  */.    if
10730 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  ( pIter->iEndofD
10740 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73  oclist>=pLeaf->s
10750 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  zLeaf ){.      i
10760 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46  nt pgno;.      F
10770 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
10780 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
10790 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20  r->pSeg;..      
107a0 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
107b0 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
107c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
107d0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
107e0 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   Search.      **
107f0 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
10800 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
10810 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
10820 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
10830 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69  or(pgno=pIter->i
10840 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e  LeafPgno+1; !p->
10850 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67  rc && pgno<=pSeg
10860 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f  ->pgnoLast; pgno
10870 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ++){.        i64
10880 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
10890 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
108a0 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  >iSegid, pgno);.
108b0 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
108c0 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
108d0 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
108e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
108f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
10900 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c  t iRowid, bTerml
10910 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ess;.          i
10920 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66  Rowid = fts5Leaf
10930 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
10940 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ew);.          b
10950 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c  Termless = fts5L
10960 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e  eafIsTermless(pN
10970 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
10980 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
10990 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c           SWAPVAL
109a0 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77  (Fts5Data*, pNew
109b0 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , pLast);.      
109c0 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d        pgnoLast =
109d0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20   pgno;.         
109e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
109f0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
10a00 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
10a10 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29  ( bTermless==0 )
10a20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10a30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10a40 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61    }..  /* If pLa
10a50 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68  st is NULL at th
10a60 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
10a70 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f  he last rowid fo
10a80 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20  r this doclist. 
10a90 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20   ** lies on the 
10aa0 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69  page currently i
10ab0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
10ac0 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69  iterator. In thi
10ad0 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74  s case .  ** pIt
10ae0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10af0 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10b00 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
10b10 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
10b20 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73  e.  ** field ass
10b30 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
10b40 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
10b50 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
10b60 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  e..  **.  ** Or,
10b70 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e   if pLast is non
10b80 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69  -NULL, then it i
10b90 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
10ba0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73  contains the las
10bb0 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e  t.  ** rowid. In
10bc0 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69   this case confi
10bd0 67 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f  gure the iterato
10be0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
10bf0 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  nts to the.  ** 
10c00 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
10c10 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  his page..  */. 
10c20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20   if( pLast ){.  
10c30 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
10c40 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
10c50 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
10c60 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
10c70 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
10c80 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
10c90 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f  pgnoLast;.    iO
10ca0 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
10cb0 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74  stRowidOff(pLast
10cc0 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
10cd0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
10ce0 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ast->p[iOff], (u
10cf0 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
10d00 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  id);.    pIter->
10d10 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
10d20 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73  ff;..    if( fts
10d30 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
10d40 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pLast) ){.      
10d50 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10d60 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e  list = pLast->nn
10d70 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10d80 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
10d90 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35  ofDoclist = fts5
10da0 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
10db0 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a  (pLast);.    }..
10dc0 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
10dd0 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
10de0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  e(p, pIter);.}..
10df0 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
10e00 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
10e10 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
10e20 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f  st rowid of a do
10e30 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20  clist..** There 
10e40 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
10e50 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
10e60 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72  th the final ter
10e70 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  m on the current
10e80 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68   .** page. If th
10e90 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
10ea0 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  s the last term 
10eb0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61  on the page, loa
10ec0 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  d the .** doclis
10ed0 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73  t-index from dis
10ee0 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  k and initialize
10ef0 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20   an iterator at 
10f00 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
10f10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10f20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
10f30 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
10f40 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
10f50 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
10f60 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
10f70 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  ->iSegid;.  int 
10f80 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
10f90 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
10fa0 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
10fb0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
10fc0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
10fd0 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
10fe0 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  data */..  asser
10ff0 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
11000 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
11010 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
11020 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
11030 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  x==0 );..  /* Ch
11040 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65  eck if the curre
11050 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20  nt doclist ends 
11060 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66  on this page. If
11070 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e   it does, return
11080 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68  .  ** early with
11090 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  out loading the 
110a0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61  doclist-index (a
110b0 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  s it belongs to 
110c0 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
110d0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20   term. */.  if( 
110e0 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
110f0 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
11100 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49  afPgno .   && pI
11110 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
11120 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  st<pLeaf->szLeaf
11130 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
11140 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  n;.  }..  pIter-
11150 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c  >pDlidx = fts5Dl
11160 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62  idxIterInit(p, b
11170 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72  Rev, iSeg, pIter
11180 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
11190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
111a0 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
111b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
111c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72  ond argument cur
111d0 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a  rently contains.
111e0 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75  ** no valid valu
111f0 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  es except for th
11200 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c  e Fts5SegIter.pL
11210 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61  eaf member varia
11220 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ble. This.** fun
11230 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
11240 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72  he leaf page for
11250 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67   a term matching
11260 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a   (pTerm/nTerm)..
11270 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65  **.** If the spe
11280 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 66  cified term is f
11290 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65  ound on the page
112a0 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
112b0 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70  tor is left.** p
112c0 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49  ointing to it. I
112d0 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69  f argument bGe i
112e0 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74  s zero and the t
112f0 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  erm is not found
11300 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f  ,.** the iterato
11310 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
11320 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ng at EOF..**.**
11330 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a   If bGe is non-z
11340 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63  ero and the spec
11350 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f  ified term is no
11360 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
11370 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73  e.** iterator is
11380 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
11390 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74  o the smallest t
113a0 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65  erm in the segme
113b0 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61  nt that.** is la
113c0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70  rger than the sp
113d0 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76  ecified term, ev
113e0 65 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20  en if this term 
113f0 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a  is not on the.**
11400 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a   current page..*
11410 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
11420 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74  s5LeafSeek(.  Ft
11430 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11450 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
11460 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20   code here */.  
11470 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20 20  int bGe,        
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d  /* True for a >=
114a0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73   search */.  Fts
114b0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114d0 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b  Iterator to seek
114e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
114f0 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
11500 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
11510 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29   search for */.)
11520 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  {.  int iOff;.  
11530 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49  const u8 *a = pI
11540 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
11550 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49   int szLeaf = pI
11560 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
11570 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49  af;.  int n = pI
11580 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
11590 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20  .  int nMatch = 
115a0 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d  0;.  int nKeep =
115b0 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   0;.  int nNew =
115c0 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f   0;.  int iTermO
115d0 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78  ff;.  int iPgidx
115e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
115f0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
11600 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64 78   offset in pgidx
11610 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66   */.  int bEndOf
11620 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
11630 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
11640 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69  TE_OK );..  iPgi
11650 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69  dx = szLeaf;.  i
11660 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
11670 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
11680 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a  dx], iTermOff);.
11690 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
116a0 66 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20  f;.  if( iOff>n 
116b0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
116c0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
116d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
116e0 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
116f0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
11700 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65  ow many new byte
11710 73 20 61 72 65 20 69 6e 20 74 68 69 73 20 74 65  s are in this te
11720 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61  rm */.    fts5Fa
11730 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
11740 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20   iOff, nNew);.  
11750 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74    if( nKeep<nMat
11760 63 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ch ){.      goto
11770 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
11780 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
11790 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68  t( nKeep>=nMatch
117a0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65   );.    if( nKee
117b0 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20  p==nMatch ){.   
117c0 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
117d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
117e0 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c  nCmp = MIN(nNew,
117f0 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a   nTerm-nMatch);.
11800 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11810 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCmp; i++){.   
11820 20 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b       if( a[iOff+
11830 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68  i]!=pTerm[nMatch
11840 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  +i] ) break;.   
11850 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63     }.      nMatc
11860 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69  h += i;..      i
11870 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68  f( nTerm==nMatch
11880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11890 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20  i==nNew ){.     
118a0 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
118b0 5f 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20  _success;.      
118c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
118d0 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
118e0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
118f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11900 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66   i<nNew && a[iOf
11910 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63  f+i]>pTerm[nMatc
11920 68 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  h] ){.        go
11930 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
11940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11950 0a 20 20 20 20 69 66 28 20 69 50 67 69 64 78 3e  .    if( iPgidx>
11960 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64  =n ){.      bEnd
11970 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  OfPage = 1;.    
11980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11990 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74      iPgidx += ft
119a0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
119b0 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29  [iPgidx], nKeep)
119c0 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
119d0 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66  = nKeep;.    iOf
119e0 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
119f0 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29     if( iOff>=n )
11a00 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
11a10 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
11a20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11a30 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  }..    /* Read t
11a40 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f  he nKeep field o
11a50 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e  f the next term.
11a60 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
11a70 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
11a80 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d  Off, nKeep);.  }
11a90 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  .. search_failed
11aa0 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20 29  :.  if( bGe==0 )
11ab0 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
11ac0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
11ad0 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
11ae0 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 72  pLeaf = 0;.    r
11af0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
11b00 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29 7b  f( bEndOfPage ){
11b10 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11b20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
11b30 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
11b40 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
11b50 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72  pLeaf==0 ) retur
11b60 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74  n;.      a = pIt
11b70 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
11b80 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
11b90 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72  IsTermless(pIter
11ba0 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20  ->pLeaf)==0 ){. 
11bb0 20 20 20 20 20 20 20 69 50 67 69 64 78 20 3d 20         iPgidx = 
11bc0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
11bd0 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69 50  Leaf;.        iP
11be0 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
11bf0 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
11c00 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78 5d  pLeaf->p[iPgidx]
11c10 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  , iOff);.       
11c20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
11c30 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
11c40 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
11c50 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
11c60 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
11c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11c80 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b        nKeep = 0;
11c90 0a 20 20 20 20 20 20 20 20 20 20 69 54 65 72 6d  .          iTerm
11ca0 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  Off = iOff;.    
11cb0 20 20 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d        n = pIter-
11cc0 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20 20 20  >pLeaf->nn;.    
11cd0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
11ce0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
11cf0 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  [iOff], nNew);. 
11d00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31 20  }.    }while( 1 
11d30 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f  );.  }.. search_
11d40 73 75 63 63 65 73 73 3a 0a 0a 20 20 70 49 74 65  success:..  pIte
11d50 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
11d60 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20 20   iOff + nNew;.  
11d70 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
11d80 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
11d90 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 70  iLeafOffset;.  p
11da0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
11db0 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
11dc0 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42  afPgno;..  fts5B
11dd0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
11de0 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
11df0 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Keep, pTerm);.  
11e00 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
11e10 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
11e20 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
11e30 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69   &a[iOff]);..  i
11e40 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a  f( iPgidx>=n ){.
11e50 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
11e60 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72  fDoclist = pIter
11e70 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20  ->pLeaf->nn+1;. 
11e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
11e90 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67 69  nExtra;.    iPgi
11ea0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
11eb0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
11ec0 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70  , nExtra);.    p
11ed0 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
11ee0 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b  ist = iTermOff +
11ef0 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70   nExtra;.  }.  p
11f00 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
11f10 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74 73  = iPgidx;..  fts
11f20 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69  5SegIterLoadRowi
11f30 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66  d(p, pIter);.  f
11f40 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
11f50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
11f60 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
11f70 73 74 6d 74 20 2a 66 74 73 35 49 64 78 53 65 6c  stmt *fts5IdxSel
11f80 65 63 74 53 74 6d 74 28 46 74 73 35 49 6e 64 65  ectStmt(Fts5Inde
11f90 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  x *p){.  if( p->
11fa0 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b  pIdxSelect==0 ){
11fb0 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
11fc0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
11fd0 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
11fe0 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
11ff0 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63  p, &p->pIdxSelec
12000 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  t, sqlite3_mprin
12010 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53  tf(.          "S
12020 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
12030 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48  '%q'.'%q_idx' WH
12040 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20  ERE ".          
12050 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72  "segid=? AND ter
12060 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65  m<=? ORDER BY te
12070 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22  rm DESC LIMIT 1"
12080 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  ,.          pCon
12090 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
120a0 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
120b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
120c0 3e 70 49 64 78 53 65 6c 65 63 74 3b 0a 7d 0a 0a  >pIdxSelect;.}..
120d0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
120e0 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65   the object pIte
120f0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65  r to point to te
12100 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77  rm pTerm/nTerm w
12110 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a  ithin segment.**
12120 20 70 53 65 67 2e 20 49 66 20 74 68 65 72 65 20   pSeg. If there 
12130 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20  is no such term 
12140 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  in the index, th
12150 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65  e iterator is se
12160 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
12170 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12180 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
12190 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
121a0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
121b0 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
121c0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
121d0 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
121e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
121f0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
12200 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12210 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12220 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74  erSeekInit(.  Ft
12230 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12250 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
12260 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
12270 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
12280 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
12290 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66  ek to */.  int f
122a0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
122b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
122c0 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
122d0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  XXX flags */.  F
122e0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
122f0 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
12300 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
12310 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
12320 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12340 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
12350 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
12360 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62  iPg = 1;.  int b
12370 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  Ge = (flags & FT
12380 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
12390 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  AN);.  int bDlid
123a0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
123b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
123c0 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
123d0 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20  list-index */.  
123e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
123f0 64 78 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  dxSelect = 0;.. 
12400 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20   assert( bGe==0 
12410 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
12420 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
12430 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
12440 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d  ( pTerm && nTerm
12450 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74   );.  memset(pIt
12460 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
12470 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
12480 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20  >pSeg = pSeg;.. 
12490 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
124a0 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ets stack variab
124b0 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65  le iPg to the le
124c0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
124d0 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e  hat may.  ** con
124e0 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d  tain term (pTerm
124f0 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69  /nTerm), if it i
12500 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
12510 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 70   segment. */.  p
12520 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73 35  IdxSelect = fts5
12530 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70 29  IdxSelectStmt(p)
12540 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20  ;.  if( p->rc ) 
12550 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
12560 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78 53  3_bind_int(pIdxS
12570 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e  elect, 1, pSeg->
12580 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69 74  iSegid);.  sqlit
12590 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64  e3_bind_blob(pId
125a0 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72  xSelect, 2, pTer
125b0 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45  m, nTerm, SQLITE
125c0 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
125d0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
125e0 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65 6c  te3_step(pIdxSel
125f0 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20  ect) ){.    i64 
12600 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
12610 6c 75 6d 6e 5f 69 6e 74 28 70 49 64 78 53 65 6c  lumn_int(pIdxSel
12620 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67  ect, 0);.    iPg
12630 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29   = (int)(val>>1)
12640 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28  ;.    bDlidx = (
12650 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20  val & 0x0001);. 
12660 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c   }.  p->rc = sql
12670 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78 53  ite3_reset(pIdxS
12680 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
12690 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64 78  3_bind_null(pIdx
126a0 53 65 6c 65 63 74 2c 20 32 29 3b 0a 0a 20 20 69  Select, 2);..  i
126b0 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e  f( iPg<pSeg->pgn
126c0 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50  oFirst ){.    iP
126d0 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  g = pSeg->pgnoFi
126e0 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20  rst;.    bDlidx 
126f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65  = 0;.  }..  pIte
12700 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
12710 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65  Pg - 1;.  fts5Se
12720 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
12730 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20   pIter);..  if( 
12740 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
12750 20 20 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b      fts5LeafSeek
12760 28 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20  (p, bGe, pIter, 
12770 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
12780 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
12790 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47  =SQLITE_OK && bG
127a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65  e==0 ){.    pIte
127b0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
127c0 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
127d0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
127e0 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
127f0 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
12800 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
12810 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
12820 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
12830 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
12840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12850 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20  if( bDlidx ){.  
12860 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12870 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49  rLoadDlidx(p, pI
12880 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
12890 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
128a0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
128b0 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  DESC ){.        
128c0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
128d0 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  se(p, pIter);.  
128e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
128f0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65  .  fts5SegIterSe
12900 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
12910 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20  ..  /* Either:. 
12920 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e   **.  **   1) an
12930 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
12940 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32  red, or.  **   2
12950 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  ) the iterator p
12960 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72  oints to EOF, or
12970 0a 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 69  .  **   3) the i
12980 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
12990 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  o an entry with 
129a0 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72  term (pTerm/nTer
129b0 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29  m), or.  **   4)
129c0 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51   the FTS5INDEX_Q
129d0 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 77  UERY_SCAN flag w
129e0 61 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 69  as set and the i
129f0 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20  terator points. 
12a00 20 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20 65   **      to an e
12a10 6e 74 72 79 20 77 69 74 68 20 61 20 74 65 72 6d  ntry with a term
12a20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
12a30 20 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72 6d   equal to (pTerm
12a40 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20  /nTerm)..  */.  
12a50 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
12a60 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20    /* 1 */.   || 
12aa0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ae0 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35   2 */.   || fts5
12af0 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f  BufferCompareBlo
12b00 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  b(&pIter->term, 
12b10 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30  pTerm, nTerm)==0
12b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a            /* 3 *
12b30 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26 20  /.   || (bGe && 
12b40 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
12b50 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65  eBlob(&pIter->te
12b60 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, pTerm, nTerm
12b70 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20  )>0)  /* 4 */.  
12b80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
12b90 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
12ba0 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
12bb0 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
12bc0 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a  Term within the.
12bd0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  ** in-memory has
12be0 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72  h table. If ther
12bf0 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
12c00 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61  m in the hash-ta
12c10 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65  ble, the .** ite
12c20 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
12c30 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  EOF..**.** If an
12c40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
12c50 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
12c60 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
12c70 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
12c80 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
12c90 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
12ca0 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
12cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12cc0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
12cd0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
12ce0 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73  d fts5SegIterHas
12cf0 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  hInit(.  Fts5Ind
12d00 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
12d10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
12d20 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f   backend */.  co
12d30 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
12d40 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
12d50 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
12d60 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
12d90 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
12da0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  lags */.  Fts5Se
12db0 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
12dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
12dd0 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
12de0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
12df0 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69   *pList = 0;.  i
12e00 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20  nt nList = 0;.  
12e10 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b  const u8 *z = 0;
12e20 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20  .  int n = 0;.. 
12e30 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73   assert( p->pHas
12e40 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  h );.  assert( p
12e50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12e60 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d  );..  if( pTerm=
12e70 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
12e80 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
12e90 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  CAN) ){.    p->r
12ea0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
12eb0 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70  ashScanInit(p->p
12ec0 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
12ed0 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r*)pTerm, nTerm)
12ee0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
12ef0 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
12f00 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
12f10 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73  char**)&z, &pLis
12f20 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
12f30 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73 74  n = (z ? (int)st
12f40 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72  rlen((const char
12f50 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c  *)z) : 0);.  }el
12f60 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66  se{.    pIter->f
12f70 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
12f80 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
12f90 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
12fa0 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68 2c  hQuery(p->pHash,
12fb0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54   (const char*)pT
12fc0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69  erm, nTerm, &pLi
12fd0 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
12fe0 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20   z = pTerm;.    
12ff0 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a  n = nTerm;.  }..
13000 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
13010 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
13020 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  af;.    sqlite3F
13030 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
13040 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
13050 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c  m, n, z);.    pL
13060 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  eaf = fts5IdxMal
13070 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
13080 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66  s5Data));.    if
13090 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74  ( pLeaf==0 ) ret
130a0 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e  urn;.    pLeaf->
130b0 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
130c0 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20      pLeaf->nn = 
130d0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
130e0 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72  nList;.    pIter
130f0 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b  ->pLeaf = pLeaf;
13100 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
13110 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
13120 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70  tVarint(pLeaf->p
13130 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
13140 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74  iRowid);.    pIt
13150 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
13160 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a  t = pLeaf->nn;..
13170 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
13180 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
13190 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49  DESC ){.      pI
131a0 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
131b0 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
131c0 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  SE;.      fts5Se
131d0 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
131e0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
131f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13200 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
13210 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
13220 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
13230 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
13240 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
13250 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65  .** Zero the ite
13260 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
13270 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
13280 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
13290 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65  d fts5SegIterCle
132a0 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20 2a  ar(Fts5SegIter *
132b0 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  pIter){.  fts5Bu
132c0 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
132d0 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61  >term);.  fts5Da
132e0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
132f0 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44  >pLeaf);.  fts5D
13300 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
13310 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20  ->pNextLeaf);.  
13320 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
13330 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29  e(pIter->pDlidx)
13340 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13350 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
13360 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28  fset);.  memset(
13370 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
13380 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a  (Fts5SegIter));.
13390 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
133a0 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68  _DEBUG../*.** Th
133b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
133c0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
133d0 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20  he big assert() 
133e0 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d  procedure implem
133f0 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35  ented by.** fts5
13400 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
13410 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72  etup(). It ensur
13420 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75  es that the resu
13430 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  lt currently sto
13440 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20  red.** in *pRes 
13450 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  is the correct r
13460 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
13470 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ng the current p
13480 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ositions of the.
13490 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73  ** two iterators
134a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
134b0 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
134c0 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46  risonResult(.  F
134d0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
134e0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
134f0 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65  p1,.  Fts5SegIte
13500 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65  r *p2,.  Fts5CRe
13510 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20  sult *pRes.){.  
13520 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49  int i1 = p1 - pI
13530 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74  ter->aSeg;.  int
13540 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72   i2 = p2 - pIter
13550 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70  ->aSeg;..  if( p
13560 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e  1->pLeaf || p2->
13570 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28  pLeaf ){.    if(
13580 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
13590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
135a0 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20  Res->iFirst==i2 
135b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
135c0 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p2->pLeaf==0 ){
135d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
135e0 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
135f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13600 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d      int nMin = M
13610 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70  IN(p1->term.n, p
13620 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  2->term.n);.    
13630 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
13640 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70  mp(p1->term.p, p
13650 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29  2->term.p, nMin)
13660 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
13670 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74  =0 ) res = p1->t
13680 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d  erm.n - p2->term
13690 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72  .n;..      if( r
136a0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
136b0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
136c0 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20  TermEq==1 );.   
136d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 2d       assert( p1-
136e0 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f  >iRowid!=p2->iRo
136f0 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  wid );.        r
13700 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
13710 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d > p2->iRowid)=
13720 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
13730 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65  -1 : 1;.      }e
13740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
13750 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d  ert( pRes->bTerm
13760 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  Eq==0 );.      }
13770 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ..      if( res<
13780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
13790 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
137a0 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d  t==i1 );.      }
137b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
137c0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
137d0 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20  st==i2 );.      
137e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
137f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13800 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  on is a no-op un
13810 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55  less SQLITE_DEBU
13820 47 20 69 73 20 64 65 66 69 6e 65 64 20 77 68 65  G is defined whe
13830 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a  n this module.**
13840 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e   is compiled. In
13850 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
13860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73   function is ess
13870 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65  entially an asse
13880 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
13890 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  nt used to verif
138a0 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  y that the conte
138b0 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72  nts of the pIter
138c0 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  ->aFirst[] array
138d0 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e  .** are correct.
138e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
138f0 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
13900 74 65 72 53 65 74 75 70 28 46 74 73 35 49 6e 64  terSetup(Fts5Ind
13910 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20  ex *p, Fts5Iter 
13920 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
13930 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13940 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
13950 65 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49  er *pFirst = &pI
13960 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
13970 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
13980 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  st ];.    int i;
13990 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ..    assert( (p
139a0 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29  First->pLeaf==0)
139b0 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  ==pIter->base.bE
139c0 6f 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  of );..    /* Ch
139d0 65 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d 3e  eck that pIter->
139e0 69 53 77 69 74 63 68 52 6f 77 69 64 20 69 73 20  iSwitchRowid is 
139f0 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
13a00 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
13a10 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
13a20 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  +){.      Fts5Se
13a30 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13a40 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
13a50 20 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70     assert( p1==p
13a60 46 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 20  First .         
13a70 20 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d    || p1->pLeaf==
13a80 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
13a90 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
13aa0 72 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72 6d  re(&pFirst->term
13ab0 2c 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20  , &p1->term) .  
13ac0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e           || p1->
13ad0 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69  iRowid==pIter->i
13ae0 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 20  SwitchRowid.    
13af0 20 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69         || (p1->i
13b00 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77  Rowid<pIter->iSw
13b10 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
13b20 72 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29 3b  r->bRev.      );
13b30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
13b40 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
13b50 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  eg; i+=2){.     
13b60 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
13b70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13b80 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65  i];.      Fts5Se
13b90 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
13ba0 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20  er->aSeg[i+1];. 
13bb0 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
13bc0 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
13bd0 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e  >aFirst[(pIter->
13be0 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a  nSeg + i) / 2];.
13bf0 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
13c00 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
13c10 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
13c20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pRes);.    }..  
13c30 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49    for(i=1; i<(pI
13c40 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20  ter->nSeg / 2); 
13c50 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73  i+=2){.      Fts
13c60 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26  5SegIter *p1 = &
13c70 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
13c80 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e  er->aFirst[i*2].
13c90 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20  iFirst ];.      
13ca0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20  Fts5SegIter *p2 
13cb0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
13cc0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a  pIter->aFirst[i*
13cd0 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  2+1].iFirst ];. 
13ce0 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
13cf0 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
13d00 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20  >aFirst[i];.    
13d10 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70    fts5AssertComp
13d20 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74  arisonResult(pIt
13d30 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73  er, p1, p2, pRes
13d40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
13d50 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
13d60 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
13d70 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64  rSetup(x,y).#end
13d80 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65  if../*.** Do the
13d90 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65   comparison nece
13da0 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74  ssary to populat
13db0 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
13dc0 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  iOut]..**.** If 
13dd0 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
13de0 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ue is non-zero, 
13df0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69  then it is the i
13e00 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79  ndex of an entry
13e10 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72  .** in the pIter
13e20 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74  ->aSeg[] array t
13e30 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61  hat is (a) not a
13e40 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70  t EOF, and (b) p
13e50 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
13e60 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75  key that is a du
13e70 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
13e80 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72  er, higher prior
13e90 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  ity, .** segment
13ea0 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65  -iterator in the
13eb0 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72   pSeg->aSeg[] ar
13ec0 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
13ed0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
13ee0 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49 74  DoCompare(Fts5It
13ef0 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69  er *pIter, int i
13f00 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20  Out){.  int i1; 
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13f30 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74   of left-hand Ft
13f40 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
13f50 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20  nt i2;          
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f70 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
13f80 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
13f90 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b  r */.  int iRes;
13fa0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13fb0 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
13fc0 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
13fd0 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
13fe0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
13ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14000 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46   /* Right-hand F
14010 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
14020 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
14030 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
14040 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73  st[iOut];..  ass
14050 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d  ert( iOut<pIter-
14060 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20  >nSeg && iOut>0 
14070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
14080 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70  er->bRev==0 || p
14090 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b  Iter->bRev==1 );
140a0 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70  ..  if( iOut>=(p
140b0 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b  Iter->nSeg/2) ){
140c0 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20  .    i1 = (iOut 
140d0 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29  - pIter->nSeg/2)
140e0 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69   * 2;.    i2 = i
140f0 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 + 1;.  }else{.
14100 20 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e      i1 = pIter->
14110 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69  aFirst[iOut*2].i
14120 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20  First;.    i2 = 
14130 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
14140 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a  ut*2+1].iFirst;.
14150 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65    }.  p1 = &pIte
14160 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70  r->aSeg[i1];.  p
14170 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
14180 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62  [i2];..  pRes->b
14190 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66  TermEq = 0;.  if
141a0 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
141b0 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {           /* I
141c0 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a  f p1 is at EOF *
141d0 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b  /.    iRes = i2;
141e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d  .  }else if( p2-
141f0 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
14200 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20   /* If p2 is at 
14210 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
14220 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = i1;.  }else{. 
14230 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73     int res = fts
14240 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26  5BufferCompare(&
14250 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74  p1->term, &p2->t
14260 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65  erm);.    if( re
14270 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  s==0 ){.      as
14280 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20  sert( i2>i1 );. 
14290 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21       assert( i2!
142a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73  =0 );.      pRes
142b0 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20  ->bTermEq = 1;. 
142c0 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f       if( p1->iRo
142d0 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20  wid==p2->iRowid 
142e0 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62  ){.        p1->b
142f0 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a  Del = p2->bDel;.
14300 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
14310 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
14320 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
14330 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
14340 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
14350 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d  ? -1 : +1;.    }
14360 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73  .    assert( res
14370 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  !=0 );.    if( r
14380 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52  es<0 ){.      iR
14390 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c  es = i1;.    }el
143a0 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d  se{.      iRes =
143b0 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i2;.    }.  }..
143c0 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
143d0 20 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65   (u16)iRes;.  re
143e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
143f0 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74   Move the seg-it
14400 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
14410 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
14420 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20  t rowid on page 
14430 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74  iLeafPgno..** It
14440 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20   is an error if 
14450 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64  leaf iLeafPgno d
14460 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
14470 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
14480 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ids..*/.static v
14490 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47  oid fts5SegIterG
144a0 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49  otoPage(.  Fts5I
144b0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
144c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
144d0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
144e0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
144f0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
14500 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
14510 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
14520 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
14530 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c  .){.  assert( iL
14540 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
14550 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69  LeafPgno );..  i
14560 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  f( iLeafPgno>pIt
14570 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  er->pSeg->pgnoLa
14580 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  st ){.    p->rc 
14590 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
145a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
145b0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
145c0 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a  er->pNextLeaf);.
145d0 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74      pIter->pNext
145e0 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49  Leaf = 0;.    pI
145f0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
14600 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20   iLeafPgno-1;.  
14610 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
14620 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
14630 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
14650 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
14660 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  o==iLeafPgno );.
14670 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
14680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14690 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
146a0 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
146b0 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
146c0 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
146d0 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
146e0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
146f0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
14700 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  Off(pIter->pLeaf
14710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
14720 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29  f<4 || iOff>=n )
14730 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
14740 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
14750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14760 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
14770 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
14780 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
14790 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
147a0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
147b0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
147c0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
147d0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
147e0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
147f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14800 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
14810 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
14820 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14830 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20  ent until it is 
14840 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72  at or .** past r
14850 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61  owid iFrom. Rega
14860 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
14870 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68  lue of iFrom, th
14880 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a  e iterator is.**
14890 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64   always advanced
148a0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a   at least once..
148b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
148c0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72  ts5SegIterNextFr
148d0 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  om(.  Fts5Index 
148e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
148f0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
14900 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
14910 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14920 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
14930 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
14940 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36   advance */.  i6
14950 34 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20  4 iMatch        
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14970 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
14980 72 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20  r at least this 
14990 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  far */.){.  int 
149a0 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
149b0 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
149c0 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
149d0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
149e0 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Dlidx = pIter->p
149f0 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65  Dlidx;.  int iLe
14a00 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e  afPgno = pIter->
14a10 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  iLeafPgno;.  int
14a20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61   bMove = 1;..  a
14a30 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
14a40 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
14a50 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20  ER_ONETERM );.  
14a60 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
14a70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72  Dlidx );.  asser
14a80 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  t( pIter->pLeaf 
14a90 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d  );..  if( bRev==
14aa0 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
14ab0 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f  !fts5DlidxIterEo
14ac0 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20  f(p, pDlidx) && 
14ad0 69 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78  iMatch>fts5Dlidx
14ae0 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
14af0 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66  ) ){.      iLeaf
14b00 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  Pgno = fts5Dlidx
14b10 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
14b20 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
14b30 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
14b40 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  idx);.    }.    
14b50 61 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66  assert_nc( iLeaf
14b60 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno>=pIter->iLe
14b70 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20  afPgno || p->rc 
14b80 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  );.    if( iLeaf
14b90 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
14ba0 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66  fPgno ){.      f
14bb0 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
14bc0 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65  ge(p, pIter, iLe
14bd0 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62  afPgno);.      b
14be0 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
14bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
14c00 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78  ert( pIter->pNex
14c10 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20  tLeaf==0 );.    
14c20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70  assert( iMatch<p
14c30 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a  Iter->iRowid );.
14c40 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35      while( !fts5
14c50 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
14c60 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63  pDlidx) && iMatc
14c70 68 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  h<fts5DlidxIterR
14c80 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a  owid(pDlidx) ){.
14c90 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
14ca0 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64  terPrev(p, pDlid
14cb0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  x);.    }.    iL
14cc0 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c  eafPgno = fts5Dl
14cd0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
14ce0 64 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  dx);..    assert
14cf0 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  ( fts5DlidxIterE
14d00 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c  of(p, pDlidx) ||
14d10 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65   iLeafPgno<=pIte
14d20 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  r->iLeafPgno );.
14d30 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67  .    if( iLeafPg
14d40 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no<pIter->iLeafP
14d50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74  gno ){.      pIt
14d60 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
14d70 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20  iLeafPgno+1;.   
14d80 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
14d90 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
14da0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d  pIter);.      bM
14db0 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
14dc0 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   }..  do{.    if
14dd0 28 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63  ( bMove && p->rc
14de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49  ==SQLITE_OK ) pI
14df0 74 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49  ter->xNext(p, pI
14e00 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ter, 0);.    if(
14e10 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
14e20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
14e30 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74  ( bRev==0 && pIt
14e40 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74  er->iRowid>=iMat
14e50 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
14e60 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70  if( bRev!=0 && p
14e70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d  Iter->iRowid<=iM
14e80 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
14e90 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d    bMove = 1;.  }
14ea0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
14eb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f  LITE_OK );.}.../
14ec0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74  *.** Free the it
14ed0 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
14ee0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
14ef0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
14f00 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14f10 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74  MultiIterFree(Ft
14f20 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
14f30 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
14f40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
14f50 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
14f60 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
14f70 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65    fts5SegIterCle
14f80 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  ar(&pIter->aSeg[
14f90 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
14fa0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
14fb0 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75  ase(pIter->pStru
14fc0 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ct);.    fts5Buf
14fd0 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
14fe0 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  poslist);.    sq
14ff0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
15000 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
15010 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
15020 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46  terAdvanced(.  F
15030 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15050 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
15060 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
15070 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
15080 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
15090 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
150a0 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
150b0 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
150c0 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
150d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
150e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
150f0 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
15100 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20  t advanced */.  
15110 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20  int iMinset     
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79  /* Minimum entry
15140 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20   in aFirst[] to 
15150 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
15160 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65  i;.  for(i=(pIte
15170 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
15180 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20  )/2; i>=iMinset 
15190 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
151a0 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  _OK; i=i/2){.   
151b0 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66   int iEq;.    if
151c0 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
151d0 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
151e0 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20  pIter, i)) ){.  
151f0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15200 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
15210 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20  aSeg[iEq];.     
15220 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
15230 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
15240 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70     pSeg->xNext(p
15250 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
15260 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65    i = pIter->nSe
15270 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20  g + iEq;.    }. 
15280 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d   }.}../*.** Sub-
15290 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65  iterator iChange
152a0 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49  d of iterator pI
152b0 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65  ter has just bee
152c0 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73  n advanced. It s
152d0 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  till.** points t
152e0 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20  o the same term 
152f0 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20  though - just a 
15300 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e  different rowid.
15310 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
15320 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70  * attempts to up
15330 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
15340 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
15350 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69  aFirst[] accordi
15360 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64  ngly..** If it d
15370 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75  oes so successfu
15380 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e  lly, 0 is return
15390 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e  ed. Otherwise 1.
153a0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65  .**.** If non-ze
153b0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ro is returned, 
153c0 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
153d0 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69  d call fts5Multi
153e0 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a  IterAdvanced().*
153f0 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f  * on the iterato
15400 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20  r instead. That 
15410 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
15420 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f  e same as this o
15430 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  ne, except.** th
15440 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68  at it deals with
15450 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
15460 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e  d cases as well.
15470 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
15480 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
15490 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73  anceRowid(.  Fts
154a0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  5Iter *pIter,   
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
154c0 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
154d0 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
154e0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
154f0 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
15500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15510 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
15520 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
15530 64 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  d */.  Fts5SegIt
15540 65 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a  er **ppFirst.){.
15550 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15560 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  New = &pIter->aS
15570 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20  eg[iChanged];.. 
15580 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69   if( pNew->iRowi
15590 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63  d==pIter->iSwitc
155a0 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e  hRowid.   || (pN
155b0 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72  ew->iRowid<pIter
155c0 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d  ->iSwitchRowid)=
155d0 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29  =pIter->bRev.  )
155e0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
155f0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f   Fts5SegIter *pO
15600 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
15610 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30  Seg[iChanged ^ 0
15620 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65  x0001];.    pIte
15630 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
15640 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20  = pIter->bRev ? 
15650 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
15660 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a   LARGEST_INT64;.
15670 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72      for(i=(pIter
15680 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
15690 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20  /2; 1; i=i/2){. 
156a0 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
156b0 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
156c0 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20  >aFirst[i];..   
156d0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
156e0 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  >pLeaf );.      
156f0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
15700 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68  ermEq==0 || pOth
15710 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20  er->pLeaf );..  
15720 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54      if( pRes->bT
15730 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20  ermEq ){.       
15740 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69   if( pNew->iRowi
15750 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  d==pOther->iRowi
15760 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  d ){.          r
15770 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
15780 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68   }else if( (pOth
15790 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d  er->iRowid>pNew-
157a0 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
157b0 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
157c0 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
157d0 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d  hRowid = pOther-
157e0 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  >iRowid;.       
157f0 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72     pNew = pOther
15800 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
15810 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f  if( (pOther->iRo
15820 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74  wid>pIter->iSwit
15830 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
15840 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
15850 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
15860 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d  hRowid = pOther-
15870 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  >iRowid;.       
15880 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15890 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
158a0 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74  (u16)(pNew - pIt
158b0 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20  er->aSeg);.     
158c0 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61   if( i==1 ) brea
158d0 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72  k;..      pOther
158e0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
158f0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
15900 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73   ^ 0x0001].iFirs
15910 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  t ];.    }.  }..
15920 20 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e 65    *ppFirst = pNe
15930 77 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  w;.  return 0;.}
15940 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15950 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69  pIter->bEof vari
15960 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68  able based on th
15970 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73  e state of the s
15980 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  ub-iterators..*/
15990 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
159a0 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
159b0 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
159c0 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
159d0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
159e0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
159f0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
15a00 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
15a10 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65  bEof = pSeg->pLe
15a20 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e  af==0;.  pIter->
15a30 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15a40 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  Seg->iRowid;.}..
15a50 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
15a60 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
15a70 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
15a80 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15a90 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
15aa0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
15ab0 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20  ts5Index.rc. It 
15ac0 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69  is not .** consi
15ad0 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
15ae0 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
15af0 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69  eaches EOF, or i
15b00 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
15b10 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20  at .** EOF when 
15b20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15b30 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
15b40 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15b50 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  iIterNext(.  Fts
15b60 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
15b70 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  s5Iter *pIter,. 
15b80 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20   int bFrom,     
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75   /* True if argu
15bb0 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61  ment iFrom is va
15bc0 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72  lid */.  i64 iFr
15bd0 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  om              
15be0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
15bf0 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20  nce at least as 
15c00 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29  far as this */.)
15c10 7b 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d  {.  int bUseFrom
15c20 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73 65   = bFrom;.  asse
15c30 72 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  rt( pIter->base.
15c40 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68 69  bEof==0 );.  whi
15c50 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
15c60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
15c70 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
15c80 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
15c90 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65  ;.    int bNewTe
15ca0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  rm = 0;.    Fts5
15cb0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
15cc0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
15cd0 72 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  rst];.    assert
15ce0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15cf0 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62 55  OK );.    if( bU
15d00 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e  seFrom && pSeg->
15d10 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  pDlidx ){.      
15d20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
15d30 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72  rom(p, pSeg, iFr
15d40 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  om);.    }else{.
15d50 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78        pSeg->xNex
15d60 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77  t(p, pSeg, &bNew
15d70 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Term);.    }..  
15d80 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
15d90 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d  f==0 || bNewTerm
15da0 20 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75   .     || fts5Mu
15db0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
15dc0 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73  wid(pIter, iFirs
15dd0 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29 7b  t, &pSeg).    ){
15de0 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
15df0 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
15e00 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31  pIter, iFirst, 1
15e10 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
15e20 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74  tiIterSetEof(pIt
15e30 65 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67 20  er);.      pSeg 
15e40 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
15e50 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15e60 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69  iFirst];.      i
15e70 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
15e80 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
15e90 7d 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65 72  }..    fts5Asser
15ea0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
15eb0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
15ec0 73 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70 49  ssert( pSeg==&pI
15ed0 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
15ee0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15ef0 74 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61  t] && pSeg->pLea
15f00 66 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  f );.    if( pIt
15f10 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d 3d  er->bSkipEmpty==
15f20 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73 20  0 || pSeg->nPos 
15f30 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
15f40 78 53 65 74 4f 75 74 70 75 74 73 28 70 49 74 65  xSetOutputs(pIte
15f50 72 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  r, pSeg);.      
15f60 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
15f70 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a    bUseFrom = 0;.
15f80 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
15f90 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15fa0 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e 64  Next2(.  Fts5Ind
15fb0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74  ex *p, .  Fts5It
15fc0 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
15fd0 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ff0 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69  OUT: True if *mi
16000 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d  ght* be new term
16010 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
16020 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70   pIter->bSkipEmp
16030 74 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  ty );.  if( p->r
16040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16050 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
16060 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
16070 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
16080 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
16090 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74  iFirst;.      Ft
160a0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
160b0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
160c0 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e  First];.      in
160d0 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a  t bNewTerm = 0;.
160e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
160f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16100 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
16110 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
16120 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
16130 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
16140 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
16150 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
16160 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
16170 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73  wid(pIter, iFirs
16180 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20 20  t, &pSeg).      
16190 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
161a0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
161b0 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
161c0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66  t, 1);.        f
161d0 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
161e0 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
161f0 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
16200 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
16210 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
16220 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
16230 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65  er);..    }while
16240 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  ( fts5MultiIterI
16250 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
16260 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
16270 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
16280 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46  etOutputs_Noop(F
16290 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64  ts5Iter *pUnused
162a0 31 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  1, Fts5SegIter *
162b0 70 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55  pUnused2){.  UNU
162c0 53 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73  SED_PARAM2(pUnus
162d0 65 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a  ed1, pUnused2);.
162e0 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 74  }..static Fts5It
162f0 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  er *fts5MultiIte
16300 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e  rAlloc(.  Fts5In
16310 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
16320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
16330 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
16340 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
16350 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46   int nSeg.){.  F
16360 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  ts5Iter *pNew;. 
16370 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20   int nSlot;     
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f   /* Power of two
163a0 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66   >= nSeg */..  f
163b0 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f  or(nSlot=2; nSlo
163c0 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53  t<nSeg; nSlot=nS
163d0 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d  lot*2);.  pNew =
163e0 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
163f0 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
16400 46 74 73 35 49 74 65 72 29 20 2b 20 20 20 20 20  Fts5Iter) +     
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16420 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69  pNew */.      si
16430 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
16440 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20  ) * (nSlot-1) + 
16450 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b    /* pNew->aSeg[
16460 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  ] */.      sizeo
16470 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a  f(Fts5CResult) *
16480 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f   nSlot         /
16490 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d  * pNew->aFirst[]
164a0 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70   */.  );.  if( p
164b0 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  New ){.    pNew-
164c0 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20  >nSeg = nSlot;. 
164d0 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20     pNew->aFirst 
164e0 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29  = (Fts5CResult*)
164f0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f  &pNew->aSeg[nSlo
16500 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49  t];.    pNew->pI
16510 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e  ndex = p;.    pN
16520 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  ew->xSetOutputs 
16530 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
16540 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20  puts_Noop;.  }. 
16550 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16570 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
16580 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16590 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20  Unused, .  void 
165a0 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
165b0 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
165c0 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
165d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
165e0 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f  used);.  assert_
165f0 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b  nc( nChunk>=0 );
16600 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20  .  if( nChunk>0 
16610 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
16620 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
16630 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f  (Fts5Buffer*)pCo
16640 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e  ntext, pChunk, n
16650 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74  Chunk);.  }.}..t
16660 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f  ypedef struct Po
16670 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16680 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
16690 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c  Ctx;.struct Posl
166a0 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b  istCallbackCtx {
166b0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
166c0 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
166d0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
166e0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
166f0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
16700 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  lset;           
16710 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
16720 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c  ches to this col
16730 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74  umn */.  int eSt
16740 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
16750 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
16760 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70  above */.};..typ
16770 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
16780 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f  istOffsetsCtx Po
16790 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b  slistOffsetsCtx;
167a0 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f  .struct PoslistO
167b0 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74  ffsetsCtx {.  Ft
167c0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167e0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
167f0 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35  buffer */.  Fts5
16800 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b  Colset *pColset;
16810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16820 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
16830 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a  to this column *
16840 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20  /.  int iRead;. 
16850 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a   int iWrite;.};.
16860 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b  ./*.** TODO: Mak
16870 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69  e this more effi
16880 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63  cient!.*/.static
16890 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f   int fts5IndexCo
168a0 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c  lsetTest(Fts5Col
168b0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e  set *pColset, in
168c0 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  t iCol){.  int i
168d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
168e0 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b  Colset->nCol; i+
168f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  +){.    if( pCol
16900 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69  set->aiCol[i]==i
16910 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Col ) return 1;.
16920 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16930 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16940 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ts5PoslistOffset
16950 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  sCallback(.  Fts
16960 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
16970 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65   .  void *pConte
16980 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
16990 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
169a0 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
169b0 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74 78  OffsetsCtx *pCtx
169c0 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65   = (PoslistOffse
169d0 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  tsCtx*)pContext;
169e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
169f0 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65  pUnused);.  asse
16a00 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
16a10 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
16a20 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >0 ){.    int i 
16a30 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
16a40 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  i<nChunk ){.    
16a50 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
16a60 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
16a70 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69  rint32(&pChunk[i
16a80 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  ], iVal);.      
16a90 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52  iVal += pCtx->iR
16aa0 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70  ead - 2;.      p
16ab0 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61  Ctx->iRead = iVa
16ac0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  l;.      if( fts
16ad0 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16ae0 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
16af0 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iVal) ){.       
16b00 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16b10 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78  ppendVarint(pCtx
16b20 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32  ->pBuf, iVal + 2
16b30 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29   - pCtx->iWrite)
16b40 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  ;.        pCtx->
16b50 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20  iWrite = iVal;. 
16b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16b70 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16b80 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
16b90 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  rCallback(.  Fts
16ba0 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
16bb0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
16bc0 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
16bd0 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
16be0 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43  nk.){.  PoslistC
16bf0 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78  allbackCtx *pCtx
16c00 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62   = (PoslistCallb
16c10 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  ackCtx*)pContext
16c20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16c30 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16c40 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16c50 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16c60 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  k>0 ){.    /* Se
16c70 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20  arch through to 
16c80 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76  find the first v
16c90 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
16ca0 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a   1. This is the.
16cb0 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20      ** start of 
16cc0 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73  the next columns
16cd0 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e   hits. */.    in
16ce0 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
16cf0 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20   iStart = 0;..  
16d00 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
16d10 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  te==2 ){.      i
16d20 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66  nt iCol;.      f
16d30 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
16d40 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
16d50 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ol);.      if( f
16d60 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
16d70 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
16d80 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  , iCol) ){.     
16d90 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
16da0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73  = 1;.        fts
16db0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
16dc0 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42  dVarint(pCtx->pB
16dd0 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  uf, 1);.      }e
16de0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
16df0 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20  x->eState = 0;. 
16e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
16e10 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69    do {.      whi
16e20 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20  le( i<nChunk && 
16e30 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20  pChunk[i]!=0x01 
16e40 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
16e50 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78  ( pChunk[i] & 0x
16e60 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  80 ) i++;.      
16e70 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
16e80 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
16e90 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
16ea0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16eb0 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e  ppendBlob(pCtx->
16ec0 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53  pBuf, &pChunk[iS
16ed0 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29  tart], i-iStart)
16ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16ef0 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  if( i<nChunk ){.
16f00 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
16f10 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
16f20 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b   = i;.        i+
16f30 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  +;.        if( i
16f40 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >=nChunk ){.    
16f50 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
16f60 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
16f70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16f80 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
16f90 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20  nt32(pChunk, i, 
16fa0 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iCol);.         
16fb0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
16fc0 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
16fd0 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
16fe0 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
16ff0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
17000 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
17010 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
17020 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74  feAppendBlob(pCt
17030 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b  x->pBuf, &pChunk
17040 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61  [iStart], i-iSta
17050 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
17060 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
17070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17080 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17090 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
170a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
170b0 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49   void fts5ChunkI
170c0 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e  terate(.  Fts5In
170d0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
170e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
170f0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  ex object */.  F
17100 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
17110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17120 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69  * Poslist of thi
17130 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  s iterator */.  
17140 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74  /* Context point
17170 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61  er for xChunk ca
17180 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64  llback */.  void
17190 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49   (*xChunk)(Fts5I
171a0 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f  ndex*, void*, co
171b0 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b  nst u8*, int).){
171c0 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53  .  int nRem = pS
171d0 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20  eg->nPos;       
171e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
171f0 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63  bytes still to c
17200 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ome */.  Fts5Dat
17210 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  a *pData = 0;.  
17220 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53  u8 *pChunk = &pS
17230 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
17240 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
17250 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20  .  int nChunk = 
17260 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e  MIN(nRem, pSeg->
17270 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20  pLeaf->szLeaf - 
17280 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
17290 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d  t);.  int pgno =
172a0 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f   pSeg->iLeafPgno
172b0 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65  ;.  int pgnoSave
172c0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
172d0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
172e0 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74  otmwork with det
172f0 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73  ail=none databas
17300 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  es. */.  assert(
17310 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
17320 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
17330 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28  L_NONE );..  if(
17340 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20   (pSeg->flags & 
17350 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
17360 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ERSE)==0 ){.    
17370 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b  pgnoSave = pgno+
17380 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  1;.  }..  while(
17390 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b   1 ){.    xChunk
173a0 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b  (p, pCtx, pChunk
173b0 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e  , nChunk);.    n
173c0 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20  Rem -= nChunk;. 
173d0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
173e0 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69  se(pData);.    i
173f0 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20  f( nRem<=0 ){.  
17400 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17410 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f  else{.      pgno
17420 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  ++;.      pData 
17430 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70  = fts5LeafRead(p
17440 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
17450 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d  OWID(pSeg->pSeg-
17460 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b  >iSegid, pgno));
17470 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
17480 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
17490 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61     pChunk = &pDa
174a0 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20  ta->p[4];.      
174b0 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
174c0 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  m, pData->szLeaf
174d0 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28   - 4);.      if(
174e0 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20   pgno==pgnoSave 
174f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17500 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65  t( pSeg->pNextLe
17510 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  af==0 );.       
17520 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
17530 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
17540 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
17550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
17560 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
17570 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
17580 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
17590 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f  id entry (not EO
175a0 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  F). This.** func
175b0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65  tion appends the
175c0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
175d0 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
175e0 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  ent entry to.** 
175f0 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20  buffer pBuf. It 
17600 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
17610 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
17620 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a  tion-list size.*
17630 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  * field..*/.stat
17640 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69  ic void fts5Segi
17650 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
17660 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
17670 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
17680 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
17690 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75  Colset,.  Fts5Bu
176a0 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
176b0 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65  if( 0==fts5Buffe
176c0 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
176d0 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20  uf, pSeg->nPos) 
176e0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ){.    if( pCols
176f0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  et==0 ){.      f
17700 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
17710 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
17720 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73  pBuf, fts5Poslis
17730 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  tCallback);.    
17740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
17750 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
17760 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
17770 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  L_FULL ){.      
17780 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63    PoslistCallbac
17790 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20  kCtx sCtx;.     
177a0 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70     sCtx.pBuf = p
177b0 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74  Buf;.        sCt
177c0 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c  x.pColset = pCol
177d0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74  set;.        sCt
177e0 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49  x.eState = fts5I
177f0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
17800 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Colset, 0);.    
17810 20 20 20 20 61 73 73 65 72 74 28 20 73 43 74 78      assert( sCtx
17820 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43  .eState==0 || sC
17830 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a  tx.eState==1 );.
17840 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e          fts5Chun
17850 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
17860 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20  , (void*)&sCtx, 
17870 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
17880 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  rCallback);.    
17890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
178a0 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
178b0 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20  tx sCtx;.       
178c0 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30   memset(&sCtx, 0
178d0 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b  , sizeof(sCtx));
178e0 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42  .        sCtx.pB
178f0 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20  uf = pBuf;.     
17900 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20     sCtx.pColset 
17910 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20  = pColset;.     
17920 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
17930 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f  ate(p, pSeg, (vo
17940 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50  id*)&sCtx, fts5P
17950 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c  oslistOffsetsCal
17960 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  lback);.      }.
17970 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17980 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65  ** IN/OUT parame
17990 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73  ter (*pa) points
179a0 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c   to a position l
179b0 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73  ist n bytes in s
179c0 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70  ize. If.** the p
179d0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
179e0 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
179f0 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74  r column iCol, t
17a00 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74  hen (*pa) is set
17a10 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  .** to point to 
17a20 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e  the sub-position
17a30 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20 63  -list for that c
17a40 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75  olumn and the nu
17a50 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73  mber of.** bytes
17a60 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e   in it returned.
17a70 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67 75   Or, if the argu
17a80 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ment position li
17a90 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63  st does not.** c
17aa0 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
17ab0 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43  es for column iC
17ac0 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ol, return 0..*/
17ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
17ae0 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
17af0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61  .  const u8 **pa
17b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17b10 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f     /* IN/OUT: Po
17b20 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74  inter to poslist
17b30 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b50 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a        /* IN: Siz
17b60 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20  e of poslist in 
17b70 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
17b80 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
17b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
17ba0 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
17bb0 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  from poslist */.
17bc0 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  ){.  int iCurren
17bd0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
17be0 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67       /* Anything
17bf0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
17c00 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20  t 0x01 is col 0 
17c10 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
17c20 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20   = *pa;.  const 
17c30 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d  u8 *pEnd = &p[n]
17c40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
17c50 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
17c60 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
17c70 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f  */..  while( iCo
17c80 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20  l>iCurrent ){.  
17c90 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69    /* Advance poi
17ca0 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20  nter p until it 
17cb0 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f  points to pEnd o
17cc0 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74  r an 0x01 byte t
17cd0 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  hat is.    ** no
17ce0 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
17cf0 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74  nt. Note that it
17d00 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
17d10 20 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a   for a negative.
17d20 20 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d      ** or extrem
17d30 65 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74  ely large varint
17d40 20 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e   to occur within
17d50 20 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20   an uncorrupted 
17d60 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  position .    **
17d70 20 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61   list. So the la
17d80 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20  st byte of each 
17d90 76 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73  varint may be as
17da0 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20  sumed to have a 
17db0 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38  clear.    ** 0x8
17dc0 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77  0 bit.  */.    w
17dd0 68 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29  hile( *p!=0x01 )
17de0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  {.      while( *
17df0 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20  p++ & 0x80 );.  
17e00 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20      if( p>=pEnd 
17e10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
17e20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b  }.    *pa = p++;
17e30 0a 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20  .    iCurrent = 
17e40 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43  *p++;.    if( iC
17e50 75 72 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b  urrent & 0x80 ){
17e60 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20  .      p--;.    
17e70 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61    p += fts5GetVa
17e80 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65  rint32(p, iCurre
17e90 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
17ea0 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72   if( iCol!=iCurr
17eb0 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ent ) return 0;.
17ec0 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f  .  /* Advance po
17ed0 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74  inter p until it
17ee0 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20   points to pEnd 
17ef0 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20  or an 0x01 byte 
17f00 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  that is.  ** not
17f10 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e   part of a varin
17f20 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c  t */.  while( p<
17f30 70 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31  pEnd && *p!=0x01
17f40 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a   ){.    while( *
17f50 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20  p++ & 0x80 );.  
17f60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20  }..  return p - 
17f70 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (*pa);.}..static
17f80 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 45   void fts5IndexE
17f90 78 74 72 61 63 74 43 6f 6c 73 65 74 28 0a 20 20  xtractColset(.  
17fa0 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35  int *pRc,.  Fts5
17fb0 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17fd0 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20  olset to filter 
17fe0 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  on */.  const u8
17ff0 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f 73   *pPos, int nPos
18000 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74  ,       /* Posit
18010 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46 74  ion list */.  Ft
18020 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20 20  s5Buffer *pBuf  
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18040 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
18050 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  /.){.  if( *pRc=
18060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18070 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 74 73    int i;.    fts
18080 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66  5BufferZero(pBuf
18090 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
180a0 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b  i<pColset->nCol;
180b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
180c0 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70 50  st u8 *pSub = pP
180d0 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53  os;.      int nS
180e0 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78  ub = fts5IndexEx
180f0 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20  tractCol(&pSub, 
18100 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61  nPos, pColset->a
18110 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  iCol[i]);.      
18120 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20 20  if( nSub ){.    
18130 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18140 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70 42  pendBlob(pRc, pB
18150 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29 3b  uf, nSub, pSub);
18160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18170 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74   }.}../*.** xSet
18180 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18190 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
181a0 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  none tables..*/.
181b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
181c0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
181d0 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  one(Fts5Iter *pI
181e0 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
181f0 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65 72   *pSeg){.  asser
18200 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18210 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18220 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18230 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72 2d  NONE );.  pIter-
18240 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
18250 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70  Seg->iRowid;.  p
18260 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
18270 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d   = pSeg->nPos;.}
18280 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18290 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
182a0 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c  d by detail=full
182b0 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c 20   and detail=col 
182c0 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a 2a  tables when no.*
182d0 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 73  * column filters
182e0 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a   are specified..
182f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18300 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18310 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35 49  s_Nocolset(Fts5I
18320 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
18330 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
18340 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
18350 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
18360 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  wid;.  pIter->ba
18370 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d  se.nData = pSeg-
18380 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72 74  >nPos;..  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 21 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 61 73 73 65 72 74 28  ONE );.  assert(
183d0 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d   pIter->pColset=
183e0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65  =0 );..  if( pSe
183f0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
18400 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
18410 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
18420 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74  {.    /* All dat
18430 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74  a is stored on t
18440 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
18450 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75   Populate the ou
18460 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72  tput .    ** var
18470 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20  iables to point 
18480 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
18490 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
184a0 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e  . */.    pIter->
184b0 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70 53  base.pData = &pS
184c0 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
184d0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
184e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
184f0 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73   The data is dis
18500 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77  tributed over tw
18510 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e  o or more pages.
18520 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68   Copy it into th
18530 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65  e.    ** Fts5Ite
18540 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72  r.poslist buffer
18550 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68   and then set th
18560 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72  e output pointer
18570 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a   to point.    **
18580 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e   to this buffer.
18590 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66    */.    fts5Buf
185a0 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
185b0 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74  poslist);.    ft
185c0 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
185d0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
185e0 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72 2d  pSeg, 0, &pIter-
185f0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70  >poslist);.    p
18600 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18610 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18620 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t.p;.  }.}../*.*
18630 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
18640 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e  llback used when
18650 20 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74 20   the Fts5Colset 
18660 6f 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c 3d  object has nCol=
18670 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67 61  =0 (match.** aga
18680 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20  inst no columns 
18690 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61 74  at all)..*/.stat
186a0 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
186b0 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43  SetOutputs_ZeroC
186c0 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20 2a  olset(Fts5Iter *
186d0 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
186e0 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e 55  er *pSeg){.  UNU
186f0 53 45 44 5f 50 41 52 41 4d 28 70 53 65 67 29 3b  SED_PARAM(pSeg);
18700 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e  .  pIter->base.n
18710 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Data = 0;.}../*.
18720 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
18730 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
18740 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e 20  detail=col when 
18750 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d  there is a colum
18760 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64 20  n filter.** and 
18770 74 68 65 72 65 20 61 72 65 20 31 30 30 20 6f 72  there are 100 or
18780 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 41   more columns. A
18790 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61 20  lso called as a 
187a0 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a  fallback from.**
187b0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
187c0 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74 68  uts_Col100 if th
187d0 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73 70  e column-list sp
187e0 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ans more than on
187f0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
18800 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
18810 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46 74  etOutputs_Col(Ft
18820 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
18830 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
18840 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  ){.  fts5BufferZ
18850 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
18860 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67 69  ist);.  fts5Segi
18870 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72  terPoslist(pIter
18880 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20  ->pIndex, pSeg, 
18890 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c 20  pIter->pColset, 
188a0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
188b0 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
188c0 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
188d0 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e  Rowid;.  pIter->
188e0 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
188f0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
18900 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
18910 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
18920 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ist.n;.}../*.** 
18930 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c  xSetOutputs call
18940 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a 20  back used when: 
18950 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61 69  .**.**   * detai
18960 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68  l=col,.**   * th
18970 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ere is a column 
18980 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20 20  filter, and.**  
18990 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e   * the table con
189a0 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65 77  tains 100 or few
189b0 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a  er columns. .**.
189c0 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e  ** The last poin
189d0 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20 61  t is to ensure a
189e0 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  ll column number
189f0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 73 20  s are stored as 
18a00 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  .** single-byte 
18a10 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  varints..*/.stat
18a20 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18a30 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30  SetOutputs_Col10
18a40 30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  0(Fts5Iter *pIte
18a50 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
18a60 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72 74  pSeg){..  assert
18a70 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
18a80 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
18a90 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43  l==FTS5_DETAIL_C
18aa0 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73 65  OLUMNS );.  asse
18ab0 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  rt( pIter->pCols
18ac0 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65  et );..  if( pSe
18ad0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
18ae0 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e  Seg->nPos>pSeg->
18af0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
18b00 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74  .    fts5IterSet
18b10 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74 65  Outputs_Col(pIte
18b20 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c 73  r, pSeg);.  }els
18b30 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 28  e{.    u8 *a = (
18b40 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61 66  u8*)&pSeg->pLeaf
18b50 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
18b60 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20 2a  ffset];.    u8 *
18b70 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b 70  pEnd = (u8*)&a[p
18b80 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20  Seg->nPos]; .   
18b90 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b 0a   int iPrev = 0;.
18ba0 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d      int *aiCol =
18bb0 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d   pIter->pColset-
18bc0 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  >aiCol;.    int 
18bd0 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69 43  *aiColEnd = &aiC
18be0 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  ol[pIter->pColse
18bf0 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75  t->nCol];..    u
18c00 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72 2d  8 *aOut = pIter-
18c10 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
18c20 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20 30  int iPrevOut = 0
18c30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  ;..    pIter->ba
18c40 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67  se.iRowid = pSeg
18c50 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 77  ->iRowid;..    w
18c60 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a  hile( a<pEnd ){.
18c70 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20 28        iPrev += (
18c80 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a  int)a++[0] - 2;.
18c90 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61 69        while( *ai
18ca0 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20 20  Col<iPrev ){.   
18cb0 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20       aiCol++;.  
18cc0 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c 3d        if( aiCol=
18cd0 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74 6f  =aiColEnd ) goto
18ce0 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f   setoutputs_col_
18cf0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
18d00 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d 69     if( *aiCol==i
18d10 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
18d20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 28  *aOut++ = (u8)((
18d30 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75 74  iPrev - iPrevOut
18d40 29 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20 20  ) + 2);.        
18d50 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65 76  iPrevOut = iPrev
18d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18d70 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f  .setoutputs_col_
18d80 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d 3e  out:.    pIter->
18d90 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
18da0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
18db0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
18dc0 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70 49  Data = aOut - pI
18dd0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18de0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
18df0 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18e00 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
18e10 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72 65  =full when there
18e20 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c   is a column fil
18e30 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
18e40 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
18e50 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73 35  utputs_Full(Fts5
18e60 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
18e70 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
18e80 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
18e90 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Colset = pIter->
18ea0 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65 72  pColset;.  pIter
18eb0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18ec0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20  pSeg->iRowid;.. 
18ed0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18ee0 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
18ef0 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
18f00 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20  ETAIL_FULL );.  
18f10 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74 20  assert( pColset 
18f20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  );..  if( pSeg->
18f30 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67  iLeafOffset+pSeg
18f40 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c  ->nPos<=pSeg->pL
18f50 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
18f60 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69     /* All data i
18f70 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
18f80 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f  current page. Po
18f90 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75  pulate the outpu
18fa0 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  t .    ** variab
18fb0 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74  les to point int
18fc0 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
18fd0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a  e page object. *
18fe0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  /.    const u8 *
18ff0 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  a = &pSeg->pLeaf
19000 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
19010 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20  ffset];.    if( 
19020 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31  pColset->nCol==1
19030 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
19040 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66 74  >base.nData = ft
19050 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
19060 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  l(&a, pSeg->nPos
19070 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b  ,pColset->aiCol[
19080 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  0]);.      pIter
19090 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 61  ->base.pData = a
190a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
190b0 20 20 20 69 6e 74 20 2a 70 52 63 20 3d 20 26 70     int *pRc = &p
190c0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
190d0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
190e0 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
190f0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66  oslist);.      f
19100 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
19110 6f 6c 73 65 74 28 70 52 63 2c 20 70 43 6f 6c 73  olset(pRc, pCols
19120 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f  et, a, pSeg->nPo
19130 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  s, &pIter->posli
19140 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  st);.      pIter
19150 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
19160 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
19170 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
19180 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
19190 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20  ->poslist.n;.   
191a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
191b0 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64  /* The data is d
191c0 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20  istributed over 
191d0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  two or more page
191e0 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20  s. Copy it into 
191f0 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49  the.    ** Fts5I
19200 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66  ter.poslist buff
19210 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20  er and then set 
19220 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74  the output point
19230 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20  er to point.    
19240 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  ** to this buffe
19250 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  r.  */.    fts5B
19260 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
19270 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
19280 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
19290 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  st(pIter->pIndex
192a0 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c  , pSeg, pColset,
192b0 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
192c0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  );.    pIter->ba
192d0 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72  se.pData = pIter
192e0 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
192f0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
19300 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
19310 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ist.n;.  }.}..st
19320 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
19330 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 69 6e  erSetOutputCb(in
19340 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65 72  t *pRc, Fts5Iter
19350 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
19360 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
19370 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
19380 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49 74  g *pConfig = pIt
19390 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e  er->pIndex->pCon
193a0 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  fig;.    if( pCo
193b0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
193c0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
193d0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
193e0 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
193f0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
19400 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  _None;.    }..  
19410 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72    else if( pIter
19420 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a  ->pColset==0 ){.
19430 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
19440 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
19450 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
19460 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20  colset;.    }.. 
19470 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65     else if( pIte
19480 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c  r->pColset->nCol
19490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==0 ){.      pIt
194a0 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
194b0 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
194c0 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b  puts_ZeroColset;
194d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65  .    }..    else
194e0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44   if( pConfig->eD
194f0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
19500 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
19510 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
19520 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
19530 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20  tOutputs_Full;. 
19540 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a     }..    else{.
19550 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
19560 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
19570 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55  FTS5_DETAIL_COLU
19580 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  MNS );.      if(
19590 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d   pConfig->nCol<=
195a0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  100 ){.        p
195b0 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
195c0 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
195d0 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20  utputs_Col100;. 
195e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
195f0 73 35 42 75 66 66 65 72 53 69 7a 65 28 70 52 63  s5BufferSize(pRc
19600 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
19610 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  t, pConfig->nCol
19620 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19630 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78          pIter->x
19640 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
19650 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19660 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
19670 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
19680 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
19690 46 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74 2e  Fts5Iter object.
196a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  .**.** The new o
196b0 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73  bject will be us
196c0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
196d0 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74  rough data in st
196e0 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
196f0 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73  .** If iLevel is
19700 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64   -ve, then all d
19710 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65  ata in all segme
19720 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f  nts is merged. O
19730 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20  r, if iLevel.** 
19740 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74  is zero or great
19750 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  er, data from th
19760 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74  e first nSegment
19770 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
19780 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  el iLevel.** is 
19790 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  merged..**.** Th
197a0 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69  e iterator initi
197b0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ally points to t
197c0 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f  he first term/ro
197d0 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65  wid entry in the
197e0 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61   .** iterated da
197f0 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
19800 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
19810 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78  New(.  Fts5Index
19820 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
19830 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
19840 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
19850 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
19860 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
19870 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  ruct,         /*
19880 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70   Structure of sp
19890 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a  ecific index */.
198a0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198c0 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51    /* FTS5INDEX_Q
198d0 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a  UERY_XXX flags *
198e0 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
198f0 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
19900 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f      /* Colset to
19910 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e   filter on (or N
19920 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ULL) */.  const 
19930 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
19940 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
19950 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72  m to seek to (or
19960 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e   NULL/0) */.  in
19970 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19990 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74   Level to iterat
199a0 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a  e (-1 for all) *
199b0 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
199c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
199d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
199e0 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
199f0 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a  ge (iLevel>=0) *
19a00 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70  /.  Fts5Iter **p
19a10 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  pOut            
19a20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
19a30 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  t */.){.  int nS
19a40 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
19a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19a60 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69  ber of segment-i
19a70 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ters in use */. 
19a80 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20   int iIter = 0; 
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65   /* */.  int iSe
19ab0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
19ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
19ad0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
19ae0 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
19af0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
19b00 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74  evel *pLvl;.  Ft
19b10 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  s5Iter *pNew;.. 
19b20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d   assert( (pTerm=
19b30 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20  =0 && nTerm==0) 
19b40 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a  || iLevel<0 );..
19b50 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
19b60 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
19b70 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74  multi-seg-iterat
19b80 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  or. */.  if( p->
19b90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19ba0 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  .    if( iLevel<
19bb0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
19bc0 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
19bd0 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
19be0 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
19bf0 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
19c00 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
19c10 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
19c20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70     nSeg += (p->p
19c30 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20  Hash ? 1 : 0);. 
19c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19c50 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75  nSeg = MIN(pStru
19c60 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65  ct->aLevel[iLeve
19c70 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e  l].nSeg, nSegmen
19c80 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
19c90 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20  *ppOut = pNew = 
19ca0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c  fts5MultiIterAll
19cb0 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69  oc(p, nSeg);.  i
19cc0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
19cd0 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65  urn;.  pNew->bRe
19ce0 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26  v = (0!=(flags &
19cf0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
19d00 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d  _DESC));.  pNew-
19d10 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28 30  >bSkipEmpty = (0
19d20 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  !=(flags & FTS5I
19d30 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45  NDEX_QUERY_SKIPE
19d40 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  MPTY));.  pNew->
19d50 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
19d60 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73  t;.  pNew->pCols
19d70 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
19d80 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66  fts5StructureRef
19d90 28 70 53 74 72 75 63 74 29 3b 0a 20 20 69 66 28  (pStruct);.  if(
19da0 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
19db0 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50  DEX_QUERY_NOOUTP
19dc0 55 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  UT)==0 ){.    ft
19dd0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43  s5IterSetOutputC
19de0 62 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b  b(&p->rc, pNew);
19df0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
19e00 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68  alize each of th
19e10 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d  e component segm
19e20 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a  ent iterators. *
19e30 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  /.  if( p->rc==S
19e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e50 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
19e60 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
19e70 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d  ureLevel *pEnd =
19e80 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
19e90 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
19ea0 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  l];.      if( p-
19eb0 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >pHash ){.      
19ec0 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65    /* Add a segme
19ed0 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  nt iterator for 
19ee0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
19ef0 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68  ents of the hash
19f00 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20   table. */.     
19f10 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
19f20 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
19f30 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
19f40 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
19f50 72 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65  rHashInit(p, pTe
19f60 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
19f70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
19f80 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c  }.      for(pLvl
19f90 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  =&pStruct->aLeve
19fa0 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b  l[0]; pLvl<pEnd;
19fb0 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pLvl++){.      
19fc0 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d    for(iSeg=pLvl-
19fd0 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30  >nSeg-1; iSeg>=0
19fe0 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20  ; iSeg--){.     
19ff0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
1a000 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
1a010 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
1a020 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46  eg];.          F
1a030 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
1a040 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
1a050 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20  iIter++];.      
1a060 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
1a070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a080 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
1a090 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  p, pSeg, pIter);
1a0a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1a0b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1a0c0 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69  s5SegIterSeekIni
1a0d0 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  t(p, pTerm, nTer
1a0e0 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20  m, flags, pSeg, 
1a0f0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
1a100 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1a110 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1a120 0a 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  .      pLvl = &p
1a130 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1a140 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f  Level];.      fo
1a150 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69  r(iSeg=nSeg-1; i
1a160 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
1a170 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
1a180 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76  IterInit(p, &pLv
1a190 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26  l->aSeg[iSeg], &
1a1a0 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
1a1b0 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ++]);.      }.  
1a1c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1a1d0 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20  iIter==nSeg );. 
1a1e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1a1f0 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73  above was succes
1a200 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f  sful, each compo
1a210 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e  nent iterators n
1a220 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20  ow points .  ** 
1a230 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1a240 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e  ry in its segmen
1a250 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1a260 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a  initialize the .
1a270 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72    ** aFirst[] ar
1a280 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ray. Or, if an e
1a290 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
1a2a0 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72  d, free the iter
1a2b0 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  ator.  ** object
1a2c0 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74   and set the out
1a2d0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
1a2e0 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
1a2f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a300 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65   ){.    for(iIte
1a310 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20  r=pNew->nSeg-1; 
1a320 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d  iIter>0; iIter--
1a330 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71  ){.      int iEq
1a340 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71  ;.      if( (iEq
1a350 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a360 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20  DoCompare(pNew, 
1a370 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20  iIter)) ){.     
1a380 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1a390 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53  pSeg = &pNew->aS
1a3a0 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20  eg[iEq];.       
1a3b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1a3c0 54 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e  TE_OK ) pSeg->xN
1a3d0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
1a3e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
1a3f0 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70  tiIterAdvanced(p
1a400 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74  , pNew, iEq, iIt
1a410 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1a420 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
1a430 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29  IterSetEof(pNew)
1a440 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74  ;.    fts5Assert
1a450 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
1a460 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66  , pNew);..    if
1a470 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70  ( pNew->bSkipEmp
1a480 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49  ty && fts5MultiI
1a490 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e  terIsEmpty(p, pN
1a4a0 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ew) ){.      fts
1a4b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
1a4c0 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  , pNew, 0, 0);. 
1a4d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65     }else if( pNe
1a4e0 77 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20  w->base.bEof==0 
1a4f0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
1a500 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e  Iter *pSeg = &pN
1a510 65 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61  ew->aSeg[pNew->a
1a520 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
1a530 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 53  ;.      pNew->xS
1a540 65 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c 20  etOutputs(pNew, 
1a550 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pSeg);.    }..  
1a560 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d  }else{.    fts5M
1a570 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e 65  ultiIterFree(pNe
1a580 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  w);.    *ppOut =
1a590 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1a5a0 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35 49   Create an Fts5I
1a5b0 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65  ter that iterate
1a5c0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f  s through the do
1a5d0 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a  clist provided.*
1a5e0 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
1a5f0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
1a600 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
1a610 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74  tiIterNew2(.  Ft
1a620 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a640 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
1a650 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
1a660 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
1a670 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
1a680 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
1a690 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1a6a0 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  gh */.  int bDes
1a6b0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1a6c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a6d0 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72  for descending r
1a6e0 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  owid order */.  
1a6f0 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74  Fts5Iter **ppOut
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a710 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
1a720 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  .){.  Fts5Iter *
1a730 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66  pNew;.  pNew = f
1a740 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
1a750 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70  c(p, 2);.  if( p
1a760 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53  New ){.    Fts5S
1a770 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
1a780 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a  &pNew->aSeg[1];.
1a790 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
1a7a0 73 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52  s = FTS5_SEGITER
1a7b0 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66  _ONETERM;.    if
1a7c0 28 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e  ( pData->szLeaf>
1a7d0 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  0 ){.      pIter
1a7e0 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b  ->pLeaf = pData;
1a7f0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
1a800 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
1a810 47 65 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d  GetVarint(pData-
1a820 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  >p, (u64*)&pIter
1a830 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
1a840 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
1a850 63 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e  clist = pData->n
1a860 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  n;.      pNew->a
1a870 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1a880 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62  = 1;.      if( b
1a890 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Desc ){.        
1a8a0 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a  pNew->bRev = 1;.
1a8b0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66          pIter->f
1a8c0 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
1a8d0 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20  ITER_REVERSE;.  
1a8e0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
1a8f0 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
1a900 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
1a910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a920 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
1a930 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
1a940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44        }.      pD
1a950 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ata = 0;.    }el
1a960 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1a970 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20  base.bEof = 1;. 
1a980 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67     }.    fts5Seg
1a990 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
1a9a0 49 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f  Iter);..    *ppO
1a9b0 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a  ut = pNew;.  }..
1a9c0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1a9d0 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pData);.}../*.
1a9e0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1a9f0 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
1aa00 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61  s at EOF or if a
1aa10 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
1aa20 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20  rred. .** False 
1aa30 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1aa40 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
1aa50 74 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  tiIterEof(Fts5In
1aa60 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
1aa70 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
1aa80 72 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20  rt( p->rc .     
1aa90 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67   || (pIter->aSeg
1aaa0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
1aab0 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
1aac0 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61  f==0)==pIter->ba
1aad0 73 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20  se.bEof .  );.  
1aae0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
1aaf0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f   pIter->base.bEo
1ab00 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  f);.}../*.** Ret
1ab10 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66  urn the rowid of
1ab20 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1ab30 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72  the iterator cur
1ab40 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a  rently points.**
1ab50 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72   to. If the iter
1ab60 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
1ab70 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OF when this fun
1ab80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ab90 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61  the.** results a
1aba0 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  re undefined..*/
1abb0 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
1abc0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46  MultiIterRowid(F
1abd0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
1abe0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
1abf0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1ac00 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1ac10 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74  ].pLeaf );.  ret
1ac20 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  urn 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 69 52 6f 77 69  ].iFirst ].iRowi
1ac50 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
1ac60 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
1ac70 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1ac80 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  at or following 
1ac90 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  iMatch..*/.stati
1aca0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
1acb0 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
1acc0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1acd0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
1ace0 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a  , .  i64 iMatch.
1acf0 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ){.  while( 1 ){
1ad00 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b  .    i64 iRowid;
1ad10 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
1ad20 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
1ad30 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20   1, iMatch);.   
1ad40 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
1ad50 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20  erEof(p, pIter) 
1ad60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f  ) break;.    iRo
1ad70 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
1ad80 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
1ad90 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1ada0 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69  bRev==0 && iRowi
1adb0 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
1adc0 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  k;.    if( pIter
1add0 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f  ->bRev!=0 && iRo
1ade0 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
1adf0 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  eak;.  }.}../*.*
1ae00 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ae10 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
1ae20 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
1ae30 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rm associated wi
1ae40 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79  th the .** entry
1ae50 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
1ae60 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1ae70 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  nts to..*/.stati
1ae80 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35  c const u8 *fts5
1ae90 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74  MultiIterTerm(Ft
1aea0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  s5Iter *pIter, i
1aeb0 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53  nt *pn){.  Fts5S
1aec0 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74  egIter *p = &pIt
1aed0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
1aee0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1aef0 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e  t ];.  *pn = p->
1af00 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e  term.n;.  return
1af10 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f   p->term.p;.}../
1af20 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
1af30 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66  new segment-id f
1af40 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
1af50 20 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65   pStruct. The ne
1af60 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20  w segment.** id 
1af70 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
1af80 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c  1 and 65335 incl
1af90 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20  usive, and must 
1afa0 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a  not be used by .
1afb0 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79  ** any currently
1afc0 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e   existing segmen
1afd0 74 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67  t. If a free seg
1afe0 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62  ment id cannot b
1aff0 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
1b000 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72  TE_FULL is retur
1b010 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ned..**.** If an
1b020 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
1b030 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1b040 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1b050 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20  no-op. 0 is .** 
1b060 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73  returned in this
1b070 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
1b080 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74   int fts5Allocat
1b090 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78  eSegid(Fts5Index
1b0a0 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
1b0b0 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
1b0c0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a  int iSegid = 0;.
1b0d0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1b0e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1b0f0 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  f( pStruct->nSeg
1b100 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53  ment>=FTS5_MAX_S
1b110 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  EGMENT ){.      
1b120 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46  p->rc = SQLITE_F
1b130 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1b140 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41        /* FTS5_MA
1b150 58 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75 72  X_SEGMENT is cur
1b160 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 61  rently defined a
1b170 73 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20 66  s 2000. So the f
1b180 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
1b190 2a 20 61 72 72 61 79 20 69 73 20 36 33 20 65 6c  * array is 63 el
1b1a0 65 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20 62  ements, or 252 b
1b1b0 79 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20  ytes, in size.  
1b1c0 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55 73  */.      u32 aUs
1b1d0 65 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45 47  ed[(FTS5_MAX_SEG
1b1e0 4d 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a  MENT+31) / 32];.
1b1f0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
1b200 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  iSeg;.      int 
1b210 69 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73  i;.      u32 mas
1b220 6b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  k;.      memset(
1b230 61 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  aUsed, 0, sizeof
1b240 28 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20 20  (aUsed));.      
1b250 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1b260 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1b270 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1b280 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1b290 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1b2a0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1b2b0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1b2c0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 74     int iId = pSt
1b2d0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b2e0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
1b2f0 65 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  egid;.          
1b300 69 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41  if( iId<=FTS5_MA
1b310 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20  X_SEGMENT ){.   
1b320 20 20 20 20 20 20 20 20 20 61 55 73 65 64 5b 28           aUsed[(
1b330 69 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20  iId-1) / 32] |= 
1b340 31 20 3c 3c 20 28 28 69 49 64 2d 31 29 20 25 20  1 << ((iId-1) % 
1b350 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  32);.          }
1b360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b370 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
1b380 30 3b 20 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46  0; aUsed[i]==0xF
1b390 46 46 46 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20  FFFFFFF; i++);. 
1b3a0 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 55 73 65       mask = aUse
1b3b0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  d[i];.      for(
1b3c0 69 53 65 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26  iSegid=0; mask &
1b3d0 20 28 31 20 3c 3c 20 69 53 65 67 69 64 29 3b 20   (1 << iSegid); 
1b3e0 69 53 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20  iSegid++);.     
1b3f0 20 69 53 65 67 69 64 20 2b 3d 20 31 20 2b 20 69   iSegid += 1 + i
1b400 2a 33 32 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  *32;..#ifdef SQL
1b410 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
1b420 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1b430 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1b440 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1b450 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1b460 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1b470 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1b480 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1b490 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 53     assert_nc( iS
1b4a0 65 67 69 64 21 3d 70 53 74 72 75 63 74 2d 3e 61  egid!=pStruct->a
1b4b0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
1b4c0 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29 3b  [iSeg].iSegid );
1b4d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b4e0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f   }.      assert_
1b4f0 6e 63 28 20 69 53 65 67 69 64 3e 30 20 26 26 20  nc( iSegid>0 && 
1b500 69 53 65 67 69 64 3c 3d 46 54 53 35 5f 4d 41 58  iSegid<=FTS5_MAX
1b510 5f 53 45 47 4d 45 4e 54 20 29 3b 0a 0a 20 20 20  _SEGMENT );..   
1b520 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c     {.        sql
1b530 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53  ite3_stmt *pIdxS
1b540 65 6c 65 63 74 20 3d 20 66 74 73 35 49 64 78 53  elect = fts5IdxS
1b550 65 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20  electStmt(p);.  
1b560 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1b570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b580 20 20 20 20 20 20 20 20 75 38 20 61 42 6c 6f 62          u8 aBlob
1b590 5b 32 5d 20 3d 20 7b 30 78 66 66 2c 20 30 78 66  [2] = {0xff, 0xf
1b5a0 66 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  f};.          sq
1b5b0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1b5c0 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 69 53  IdxSelect, 1, iS
1b5d0 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  egid);.         
1b5e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1b5f0 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32  ob(pIdxSelect, 2
1b600 2c 20 61 42 6c 6f 62 2c 20 32 2c 20 53 51 4c 49  , aBlob, 2, SQLI
1b610 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1b620 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
1b630 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
1b640 64 78 53 65 6c 65 63 74 29 21 3d 53 51 4c 49 54  dxSelect)!=SQLIT
1b650 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 20  E_ROW );.       
1b660 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1b670 65 33 5f 72 65 73 65 74 28 70 49 64 78 53 65 6c  e3_reset(pIdxSel
1b680 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ect);.          
1b690 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
1b6a0 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29  l(pIdxSelect, 2)
1b6b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b6c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1b6d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
1b6e0 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Segid;.}../*.** 
1b6f0 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61  Discard all data
1b700 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
1b710 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61  d in the hash-ta
1b720 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1b730 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44 69  void fts5IndexDi
1b740 73 63 61 72 64 44 61 74 61 28 46 74 73 35 49 6e  scardData(Fts5In
1b750 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dex *p){.  asser
1b760 74 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70  t( p->pHash || p
1b770 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d  ->nPendingData==
1b780 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48  0 );.  if( p->pH
1b790 61 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ash ){.    sqlit
1b7a0 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
1b7b0 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70  p->pHash);.    p
1b7c0 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1b7d0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1b7e0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1b7f0 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c 20   of the prefix, 
1b800 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20 62  in bytes, that b
1b810 75 66 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77 2f  uffer .** (pNew/
1b820 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e  <length-unknown>
1b830 29 20 73 68 61 72 65 73 20 77 69 74 68 20 62 75  ) shares with bu
1b840 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29  ffer (pOld/nOld)
1b850 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ..**.** Buffer (
1b860 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b  pNew/<length-unk
1b870 6e 6f 77 6e 3e 29 20 69 73 20 67 75 61 72 61 6e  nown>) is guaran
1b880 74 65 65 64 20 74 6f 20 62 65 20 67 72 65 61 74  teed to be great
1b890 65 72 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66 66  er .** than buff
1b8a0 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a  er (pOld/nOld)..
1b8b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1b8c0 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
1b8d0 28 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74  (int nOld, const
1b8e0 20 75 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74   u8 *pOld, const
1b8f0 20 75 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69 6e   u8 *pNew){.  in
1b900 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1b910 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
1b920 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70    if( pOld[i]!=p
1b930 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  New[i] ) break;.
1b940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
1b950 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1b960 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65  ts5WriteDlidxCle
1b970 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ar(.  Fts5Index 
1b980 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1b990 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
1b9a0 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20   int bFlush     
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69   /* If true, wri
1b9d0 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b  te dlidx to disk
1b9e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1b9f0 20 20 61 73 73 65 72 74 28 20 62 46 6c 75 73 68    assert( bFlush
1ba00 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  ==0 || (pWriter-
1ba10 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
1ba20 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1ba30 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f  buf.n>0) );.  fo
1ba40 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72  r(i=0; i<pWriter
1ba50 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a  ->nDlidx; i++){.
1ba60 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1ba70 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
1ba80 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
1ba90 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  ];.    if( pDlid
1baa0 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72  x->buf.n==0 ) br
1bab0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c  eak;.    if( bFl
1bac0 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ush ){.      ass
1bad0 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e  ert( pDlidx->pgn
1bae0 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74  o!=0 );.      ft
1baf0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
1bb00 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
1bb10 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
1bb20 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
1bb30 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
1bb40 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
1bb50 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
1bb60 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
1bb70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
1bb80 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
1bb90 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20  Dlidx->buf);.   
1bba0 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1bbb0 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  lid = 0;.  }.}..
1bbc0 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70  /*.** Grow the p
1bbd0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d  Writer->aDlidx[]
1bbe0 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61   array to at lea
1bbf0 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73  st nLvl elements
1bc00 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79   in size..** Any
1bc10 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65   new array eleme
1bc20 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62  nts are zeroed b
1bc30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1bc40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bc50 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1bc60 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  w(.  Fts5Index *
1bc70 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  p,.  Fts5SegWrit
1bc80 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
1bc90 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28  nt nLvl.){.  if(
1bca0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1bcb0 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74  K && nLvl>=pWrit
1bcc0 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20  er->nDlidx ){.  
1bcd0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1bce0 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73  r *aDlidx = (Fts
1bcf0 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71  5DlidxWriter*)sq
1bd00 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
1bd10 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
1bd20 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46  aDlidx, sizeof(F
1bd30 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20  ts5DlidxWriter) 
1bd40 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20  * nLvl.    );.  
1bd50 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20    if( aDlidx==0 
1bd60 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1bd70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1bd80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bd90 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
1bda0 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  of(Fts5DlidxWrit
1bdb0 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57  er) * (nLvl - pW
1bdc0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a  riter->nDlidx);.
1bdd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44        memset(&aD
1bde0 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44  lidx[pWriter->nD
1bdf0 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29  lidx], 0, nByte)
1be00 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
1be10 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78  >aDlidx = aDlidx
1be20 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
1be30 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a  >nDlidx = nLvl;.
1be40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1be50 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
1be60 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
1be70 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  t doclist-index 
1be80 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20  accumulating in 
1be90 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1bea0 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  ] is large.** en
1beb0 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74  ough, flush it t
1bec0 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72  o disk and retur
1bed0 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64  n 1. Otherwise d
1bee0 69 73 63 61 72 64 20 69 74 20 61 6e 64 20 72 65  iscard it and re
1bef0 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f  turn.** zero..*/
1bf00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1bf10 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28  WriteFlushDlidx(
1bf20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1bf30 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1bf40 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c  iter){.  int bFl
1bf50 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ag = 0;..  /* If
1bf60 20 74 68 65 72 65 20 77 65 72 65 20 46 54 53 35   there were FTS5
1bf70 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
1bf80 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65  or more empty le
1bf90 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
1bfa0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  .  ** to the dat
1bfb0 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74  abase, also writ
1bfc0 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  e the doclist-in
1bfd0 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f  dex to disk.  */
1bfe0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
1bff0 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
1c000 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45  0 && pWriter->nE
1c010 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44  mpty>=FTS5_MIN_D
1c020 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20  LIDX_SIZE ){.   
1c030 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a   bFlag = 1;.  }.
1c040 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1c050 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72  Clear(p, pWriter
1c060 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69  , bFlag);.  pWri
1c070 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b  ter->nEmpty = 0;
1c080 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b  .  return bFlag;
1c090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1c0a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c0b0 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65  d whenever proce
1c0c0 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63  ssing of the doc
1c0d0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a  list for the .**
1c0e0 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65   last term on le
1c0f0 61 66 20 70 61 67 65 20 28 70 57 72 69 74 65 72  af page (pWriter
1c100 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20 63 6f  ->iBtPage) is co
1c110 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  mpleted. .**.** 
1c120 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  The doclist-inde
1c130 78 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20  x for that term 
1c140 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
1c150 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69  red in-memory wi
1c160 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35  thin the.** Fts5
1c170 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78  SegWriter.aDlidx
1c180 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74 20  [] array. If it 
1c190 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c  is large enough,
1c1a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1c1b0 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75 74 20  * writes it out 
1c1c0 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20  to disk. Or, if 
1c1d0 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  it is too small 
1c1e0 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20  to bother with, 
1c1f0 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a  discards.** it..
1c200 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69  **.** Fts5SegWri
1c210 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65  ter.btterm curre
1c220 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntly contains th
1c230 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1c240 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f  page iBtPage..*/
1c250 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c260 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65  5WriteFlushBtree
1c270 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1c280 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1c290 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46  riter){.  int bF
1c2a0 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  lag;..  assert( 
1c2b0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1c2c0 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   || pWriter->nEm
1c2d0 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pty==0 );.  if( 
1c2e0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1c2f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1c300 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74  bFlag = fts5Writ
1c310 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70  eFlushDlidx(p, p
1c320 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20  Writer);..  if( 
1c330 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c340 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1c350 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72  ar *z = (pWriter
1c360 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f  ->btterm.n>0?(co
1c370 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69 74 65  nst char*)pWrite
1c380 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b  r->btterm.p:"");
1c390 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1c3a0 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64  owing was alread
1c3b0 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72  y done in fts5Wr
1c3c0 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20  iteInit(): */.  
1c3d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e    /* sqlite3_bin
1c3e0 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69  d_int(p->pIdxWri
1c3f0 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d  ter, 1, pWriter-
1c400 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20  >iSegid); */.   
1c410 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1c420 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ob(p->pIdxWriter
1c430 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d  , 2, z, pWriter-
1c440 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54  >btterm.n, SQLIT
1c450 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
1c460 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
1c470 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  4(p->pIdxWriter,
1c480 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36   3, bFlag + ((i6
1c490 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  4)pWriter->iBtPa
1c4a0 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c  ge<<1));.    sql
1c4b0 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
1c4c0 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d  xWriter);.    p-
1c4d0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1c4e0 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65  set(p->pIdxWrite
1c4f0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
1c500 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70 49 64  bind_null(p->pId
1c510 78 57 72 69 74 65 72 2c 20 32 29 3b 0a 20 20 7d  xWriter, 2);.  }
1c520 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
1c530 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  age = 0;.}../*.*
1c540 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
1c550 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c   once for each l
1c560 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
1c570 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20 63  the first that c
1c580 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65  ontains.** at le
1c590 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72  ast one term. Ar
1c5a0 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54  gument (nTerm/pT
1c5b0 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69  erm) is the spli
1c5c0 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74  t-key - a term t
1c5d0 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  hat.** is larger
1c5e0 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20   than all terms 
1c5f0 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69  written to earli
1c600 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65  er leaves, and e
1c610 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d  qual to or.** sm
1c620 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66  aller than the f
1c630 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  irst term on the
1c640 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a   new leaf..**.**
1c650 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c660 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1c670 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
1c680 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61  s5Index.rc. If a
1c690 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61  n error.** has a
1c6a0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
1c6b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1c6c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
1c6d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c6e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c6f0 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a  WriteBtreeTerm(.
1c700 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1c730 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1c740 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1c750 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
1c760 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1c770 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  /.  int nTerm, c
1c780 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20  onst u8 *pTerm  
1c790 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72      /* First ter
1c7a0 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f  m on new page */
1c7b0 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46  .){.  fts5WriteF
1c7c0 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72  lushBtree(p, pWr
1c7d0 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  iter);.  fts5Buf
1c7e0 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1c7f0 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c  pWriter->btterm,
1c800 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
1c810 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61    pWriter->iBtPa
1c820 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72  ge = pWriter->wr
1c830 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iter.pgno;.}../*
1c840 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c850 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
1c860 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66   flushing a leaf
1c870 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1c880 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20  ins no.** terms 
1c890 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a  at all to disk..
1c8a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c8b0 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
1c8c0 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1c8d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1c8e0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1c8f0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1c900 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1c910 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20   *pWriter       
1c920 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1c930 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49  ect */.){.  /* I
1c940 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
1c950 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65  rowids on the le
1c960 61 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61  af page either a
1c970 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  nd the doclist-i
1c980 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c  ndex.  ** has al
1c990 72 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74  ready been start
1c9a0 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78  ed, append an 0x
1c9b0 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20  00 byte to it.  
1c9c0 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
1c9d0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1c9e0 61 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e  age && pWriter->
1c9f0 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
1ca00 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  0 ){.    Fts5Dli
1ca10 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
1ca20 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1ca30 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  idx[0];.    asse
1ca40 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  rt( pDlidx->bPre
1ca50 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71  vValid );.    sq
1ca60 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1ca70 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1ca80 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1ca90 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1caa0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e  Increment the "n
1cab0 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74  umber of sequent
1cac0 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f  ial leaves witho
1cad0 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74  ut a term" count
1cae0 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  er. */.  pWriter
1caf0 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73  ->nEmpty++;.}..s
1cb00 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c  tatic i64 fts5Dl
1cb10 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52  idxExtractFirstR
1cb20 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20  owid(Fts5Buffer 
1cb30 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52  *pBuf){.  i64 iR
1cb40 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66  owid;.  int iOff
1cb50 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20  ;..  iOff = 1 + 
1cb60 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
1cb70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a  Buf->p[1], (u64*
1cb80 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73  )&iRowid);.  fts
1cb90 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
1cba0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
1cbb0 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74  )&iRowid);.  ret
1cbc0 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  urn iRowid;.}../
1cbd0 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69  *.** Rowid iRowi
1cbe0 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  d has just been 
1cbf0 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1cc00 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
1cc10 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20  e. It is the.** 
1cc20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67  first on the pag
1cc30 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1cc40 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72   appends an appr
1cc50 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f  opriate entry to
1cc60 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1cc70 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
1cc80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1cc90 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
1cca0 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
1ccb0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1ccc0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1ccd0 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
1cce0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
1ccf0 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  Done = 0;..  for
1cd00 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
1cd10 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d  ITE_OK && bDone=
1cd20 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  =0; i++){.    i6
1cd30 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35  4 iVal;.    Fts5
1cd40 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
1cd50 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1cd60 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20  aDlidx[i];..    
1cd70 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
1cd80 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
1cd90 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  gsz ){.      /* 
1cda0 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  The current docl
1cdb0 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69  ist-index page i
1cdc0 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74  s full. Write it
1cdd0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73   to disk and pus
1cde0 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70  h.      ** a cop
1cdf0 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69  y of iRowid (whi
1ce00 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ch will become t
1ce10 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1ce20 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  n the next.     
1ce30 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   ** doclist-inde
1ce40 78 20 6c 65 61 66 20 70 61 67 65 29 20 75 70 20  x leaf page) up 
1ce50 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65  into the next le
1ce60 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65  vel of the b-tre
1ce70 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72  e .      ** hier
1ce80 61 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f  archy. If the no
1ce90 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64  de being flushed
1cea0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68   is currently th
1ceb0 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20  e root node,.   
1cec0 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20     ** also push 
1ced0 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20  its first rowid 
1cee0 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20  upwards. */.    
1cef0 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b    pDlidx->buf.p[
1cf00 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a  0] = 0x01;    /*
1cf10 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f   Not the root no
1cf20 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  de */.      fts5
1cf30 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20  DataWrite(p, .  
1cf40 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
1cf50 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  DX_ROWID(pWriter
1cf60 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c  ->iSegid, i, pDl
1cf70 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20  idx->pgno),.    
1cf80 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1cf90 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66  f.p, pDlidx->buf
1cfa0 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
1cfb0 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1cfc0 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c  Grow(p, pWriter,
1cfd0 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c   i+2);.      pDl
1cfe0 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1cff0 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20  aDlidx[i];.     
1d000 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1d010 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b  TE_OK && pDlidx[
1d020 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20  1].buf.n==0 ){. 
1d030 20 20 20 20 20 20 20 69 36 34 20 69 46 69 72 73         i64 iFirs
1d040 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74  t = fts5DlidxExt
1d050 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 26  ractFirstRowid(&
1d060 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20  pDlidx->buf);.. 
1d070 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77         /* This w
1d080 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  as the root node
1d090 2e 20 50 75 73 68 20 69 74 73 20 66 69 72 73 74  . Push its first
1d0a0 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65   rowid up to the
1d0b0 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20   new root. */.  
1d0c0 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
1d0d0 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70  pgno = pDlidx->p
1d0e0 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  gno;.        sql
1d0f0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1d100 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d110 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
1d120 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 0);.        s
1d130 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d140 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d150 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1d160 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  buf, pDlidx->pgn
1d170 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1d180 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d190 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d1a0 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
1d1b0 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
1d1c0 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72     pDlidx[1].bPr
1d1d0 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  evValid = 1;.   
1d1e0 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69       pDlidx[1].i
1d1f0 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20  Prev = iFirst;. 
1d200 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
1d210 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
1d220 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  ero(&pDlidx->buf
1d230 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  );.      pDlidx-
1d240 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b  >bPrevValid = 0;
1d250 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70  .      pDlidx->p
1d260 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
1d270 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20  {.      bDone = 
1d280 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
1d290 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56  ( pDlidx->bPrevV
1d2a0 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56  alid ){.      iV
1d2b0 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44  al = iRowid - pD
1d2c0 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20  lidx->iPrev;.   
1d2d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
1d2e0 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20  4 iPgno = (i==0 
1d2f0 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ? pWriter->write
1d300 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b  r.pgno : pDlidx[
1d310 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  -1].pgno);.     
1d320 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1d330 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  >buf.n==0 );.   
1d340 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d350 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d360 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d370 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a  ->buf, !bDone);.
1d380 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d390 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d3a0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d3b0 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29  idx->buf, iPgno)
1d3c0 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69  ;.      iVal = i
1d3d0 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  Rowid;.    }..  
1d3e0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d3f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d400 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1d410 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20  >buf, iVal);.   
1d420 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1d430 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c  lid = 1;.    pDl
1d440 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f  idx->iPrev = iRo
1d450 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  wid;.  }.}..stat
1d460 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1d470 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49  eFlushLeaf(Fts5I
1d480 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1d490 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1d4a0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1d4b0 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30   u8 zero[] = { 0
1d4c0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
1d4d0 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50   0x00 };.  Fts5P
1d4e0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
1d4f0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1d500 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  ter;.  i64 iRowi
1d510 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  d;..  assert( (p
1d520 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
1d530 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69  )==(pWriter->bFi
1d540 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29  rstTermInPage) )
1d550 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1d560 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69  szLeaf header fi
1d570 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  eld. */.  assert
1d580 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28  ( 0==fts5GetU16(
1d590 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d  &pPage->buf.p[2]
1d5a0 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31  ) );.  fts5PutU1
1d5b0 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
1d5c0 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e  2], (u16)pPage->
1d5d0 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70  buf.n);..  if( p
1d5e0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d5f0 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  rmInPage ){.    
1d600 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77  /* No term was w
1d610 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70  ritten to this p
1d620 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
1d630 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78  rt( pPage->pgidx
1d640 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73  .n==0 );.    fts
1d650 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72  5WriteBtreeNoTer
1d660 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  m(p, pWriter);. 
1d670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
1d680 70 70 65 6e 64 20 74 68 65 20 70 67 69 64 78 20  ppend the pgidx 
1d690 74 6f 20 74 68 65 20 70 61 67 65 20 62 75 66 66  to the page buff
1d6a0 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65  er. Set the szLe
1d6b0 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e  af header field.
1d6c0 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66   */.    fts5Buff
1d6d0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1d6e0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1d6f0 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  , pPage->pgidx.n
1d700 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70  , pPage->pgidx.p
1d710 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
1d720 74 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  te the page out 
1d730 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f  to disk */.  iRo
1d740 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1d750 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
1d760 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d  ->iSegid, pPage-
1d770 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61  >pgno);.  fts5Da
1d780 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69  taWrite(p, iRowi
1d790 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  d, pPage->buf.p,
1d7a0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
1d7b0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1d7c0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20   the next page. 
1d7d0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  */.  fts5BufferZ
1d7e0 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29  ero(&pPage->buf)
1d7f0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  ;.  fts5BufferZe
1d800 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78  ro(&pPage->pgidx
1d810 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
1d820 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1d830 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
1d840 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65  , zero);.  pPage
1d850 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 30  ->iPrevPgidx = 0
1d860 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b  ;.  pPage->pgno+
1d870 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73  +;..  /* Increas
1d880 65 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69  e the leaves wri
1d890 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  tten counter */.
1d8a0 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
1d8b0 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a  Written++;..  /*
1d8c0 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f   The new leaf ho
1d8d0 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20  lds no terms or 
1d8e0 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69  rowids */.  pWri
1d8f0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1d900 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72  nPage = 1;.  pWr
1d910 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1d920 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a  dInPage = 1;.}..
1d930 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72  /*.** Append ter
1d940 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f  m pTerm/nTerm to
1d950 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69   the segment bei
1d960 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68  ng written by th
1d970 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a  e writer passed.
1d980 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
1d990 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
1d9a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d9b0 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1d9c0 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1d9d0 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1d9e0 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1d9f0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1da00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1da10 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1da20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1da30 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35  pendTerm(.  Fts5
1da40 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1da50 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1da60 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d  ter,.  int nTerm
1da70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
1da80 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65  m .){.  int nPre
1da90 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
1daa0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1dab0 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72   of prefix compr
1dac0 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20  ession for term 
1dad0 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
1dae0 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
1daf0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1db00 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
1db10 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1db20 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20  writer.pgidx;.. 
1db30 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1db40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
1db50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
1db60 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65  f.n>=4 );.  asse
1db70 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  rt( pPage->buf.n
1db80 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62  >4 || pWriter->b
1db90 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1dba0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1dbb0 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
1dbc0 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68  e is full, flush
1dbd0 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a   it to disk. */.
1dbe0 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75    if( (pPage->bu
1dbf0 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  f.n + pPgidx->n 
1dc00 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d  + nTerm + 2)>=p-
1dc10 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
1dc20 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
1dc30 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20  >buf.n>4 ){.    
1dc40 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1dc50 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1dc60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1dc70 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1dc80 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1dc90 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f  nTerm+FTS5_DATA_
1dca0 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20  PADDING);.  }.  
1dcb0 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64  .  /* TODO1: Upd
1dcc0 61 74 69 6e 67 20 70 67 69 64 78 20 68 65 72 65  ating pgidx here
1dcd0 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e  . */.  pPgidx->n
1dce0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
1dcf0 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20  utVarint(.      
1dd00 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64  &pPgidx->p[pPgid
1dd10 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75  x->n], pPage->bu
1dd20 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72  f.n - pPage->iPr
1dd30 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70  evPgidx.  );.  p
1dd40 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78  Page->iPrevPgidx
1dd50 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b   = pPage->buf.n;
1dd60 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50 75 74  .#if 0.  fts5Put
1dd70 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70  U16(&pPgidx->p[p
1dd80 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65  Pgidx->n], pPage
1dd90 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69  ->buf.n);.  pPgi
1dda0 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64  dx->n += 2;.#end
1ddb0 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65  if..  if( pWrite
1ddc0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1ddd0 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66  age ){.    nPref
1dde0 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ix = 0;.    if( 
1ddf0 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29  pPage->pgno!=1 )
1de00 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1de10 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
1de20 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74  m on a leaf that
1de30 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74   is not the left
1de40 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20  most leaf in.   
1de50 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e     ** the segmen
1de60 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69  t b-tree. In thi
1de70 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63  s case it is nec
1de80 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20  essary to add a 
1de90 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a  term to.      **
1dea0 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1deb0 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61  archy that is (a
1dec0 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  ) larger than th
1ded0 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a  e largest term .
1dee0 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
1def0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1df00 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20  segment and (b) 
1df10 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20  smaller than or 
1df20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a  equal to.      *
1df30 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20  * this term. In 
1df40 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70  other words, a p
1df50 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f  refix of (pTerm/
1df60 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f  nTerm) that is o
1df70 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  ne.      ** byte
1df80 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65   longer than the
1df90 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20   longest prefix 
1dfa0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68  (pTerm/nTerm) sh
1dfb0 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20  ares with the.  
1dfc0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
1dfd0 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  term. .      **.
1dfe0 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79        ** Usually
1dff0 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  , the previous t
1e000 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65  erm is available
1e010 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e   in pPage->term.
1e020 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20   The exception. 
1e030 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68       ** is if th
1e040 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1e050 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20  term written in 
1e060 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d  an incremental-m
1e070 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20  erge step..     
1e080 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
1e090 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
1e0a0 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  rm is not availa
1e0b0 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69  ble, so just wri
1e0c0 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  te a.      ** co
1e0d0 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65  py of (pTerm/nTe
1e0e0 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72  rm) into the par
1e0f0 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69  ent node. This i
1e100 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  s slightly.     
1e110 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c   ** inefficient,
1e120 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65   but still corre
1e130 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ct.  */.      in
1e140 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  t n = nTerm;.   
1e150 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65     if( pPage->te
1e160 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  rm.n ){.        
1e170 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66  n = 1 + fts5Pref
1e180 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
1e190 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
1e1a0 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b  >term.p, pTerm);
1e1b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1e1c0 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
1e1d0 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c  m(p, pWriter, n,
1e1e0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70   pTerm);.      p
1e1f0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1e200 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20  >writer;.    }. 
1e210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65   }else{.    nPre
1e220 66 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78  fix = fts5Prefix
1e230 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e  Compress(pPage->
1e240 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74  term.n, pPage->t
1e250 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20  erm.p, pTerm);. 
1e260 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1e270 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1e280 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1e290 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20  Prefix);.  }..  
1e2a0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75  /* Append the nu
1e2b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1e2c0 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20   new data, then 
1e2d0 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74  the term data it
1e2e0 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65  self.  ** to the
1e2f0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
1e300 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e310 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e320 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
1e330 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35  nPrefix);.  fts5
1e340 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1e350 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1e360 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
1e370 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50  refix, &pTerm[nP
1e380 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55  refix]);..  /* U
1e390 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61  pdate the Fts5Pa
1e3a0 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69  geWriter.term fi
1e3b0 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  eld. */.  fts5Bu
1e3c0 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1e3d0 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
1e3e0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70  erm, pTerm);.  p
1e3f0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1e400 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  rmInPage = 0;.. 
1e410 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e420 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
1e430 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e440 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1e450 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
1e460 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74   p->rc || (pWrit
1e470 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20  er->nDlidx>0 && 
1e480 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1e490 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a  0].buf.n==0) );.
1e4a0 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1e4b0 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67  x[0].pgno = pPag
1e4c0 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  e->pgno;.}../*.*
1e4d0 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64  * Append a rowid
1e4e0 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   and position-li
1e4f0 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f  st size field to
1e500 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74   the writers out
1e510 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  put. .*/.static 
1e520 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1e530 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73  pendRowid(.  Fts
1e540 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1e550 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1e560 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77  iter,.  i64 iRow
1e570 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  id.){.  if( p->r
1e580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e590 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
1e5a0 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1e5b0 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20  iter->writer;.. 
1e5c0 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62     if( (pPage->b
1e5d0 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
1e5e0 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  idx.n)>=p->pConf
1e5f0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1e600 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1e610 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1e620 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e630 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65  If this is to be
1e640 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1e650 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e660 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20  page, set the . 
1e670 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e     ** rowid-poin
1e680 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d  ter in the page-
1e690 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70  header. Also app
1e6a0 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74  end a value to t
1e6b0 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20  he dlidx.    ** 
1e6c0 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20  buffer, in case 
1e6d0 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
1e6e0 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
1e6f0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1e700 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1e710 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
1e720 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62  5PutU16(pPage->b
1e730 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61 67 65  uf.p, (u16)pPage
1e740 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
1e750 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1e760 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c  pend(p, pWriter,
1e770 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a   iRowid);.    }.
1e780 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
1e790 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20  e rowid. */.    
1e7a0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1e7b0 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1e7c0 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
1e7d0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1e7e0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1e7f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e800 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e810 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
1e820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e830 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
1e840 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e  iRowid>pWriter->
1e850 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20  iPrevRowid );.  
1e860 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1e870 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1e880 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1e890 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72  iRowid - pWriter
1e8a0 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20  ->iPrevRowid);. 
1e8b0 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72     }.    pWriter
1e8c0 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69  ->iPrevRowid = i
1e8d0 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74  Rowid;.    pWrit
1e8e0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1e8f0 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20  nDoclist = 0;.  
1e900 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1e910 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
1e920 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1e930 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1e940 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
1e950 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1e960 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1e970 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63  r *pWriter, .  c
1e980 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
1e990 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a  .  int nData.){.
1e9a0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1e9b0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
1e9c0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f  er->writer;.  co
1e9d0 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74  nst u8 *a = aDat
1e9e0 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61  a;.  int n = nDa
1e9f0 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  ta;.  .  assert(
1ea00 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1ea10 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  z>0 );.  while( 
1ea20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ea30 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
1ea40 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d  ->buf.n + pPage-
1ea50 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70  >pgidx.n + n)>=p
1ea60 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1ea70 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  .  ){.    int nR
1ea80 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  eq = p->pConfig-
1ea90 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62  >pgsz - pPage->b
1eaa0 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67  uf.n - pPage->pg
1eab0 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  idx.n;.    int n
1eac0 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68  Copy = 0;.    wh
1ead0 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20  ile( nCopy<nReq 
1eae0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d  ){.      i64 dum
1eaf0 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20  my;.      nCopy 
1eb00 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
1eb10 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34  (&a[nCopy], (u64
1eb20 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d  *)&dummy);.    }
1eb30 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1eb40 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1eb50 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1eb60 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20  Copy, a);.    a 
1eb70 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20  += nCopy;.    n 
1eb80 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74  -= nCopy;.    ft
1eb90 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1eba0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1ebb0 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
1ebc0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ebd0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1ebe0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20  &pPage->buf, n, 
1ebf0 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
1ec00 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
1ec10 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
1ec20 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
1ec30 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
1ec40 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
1ec50 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
1ec60 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
1ec70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ec80 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1ec90 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1eca0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1ecb0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
1ecc0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1ecd0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
1ece0 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
1ecf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1ed00 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  : Number of leaf
1ed10 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65   pages in b-tree
1ed20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1ed30 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1ed40 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74   *pLeaf = &pWrit
1ed50 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66  er->writer;.  if
1ed60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ed70 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1ed80 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31  ( pLeaf->pgno>=1
1ed90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61   );.    if( pLea
1eda0 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
1edb0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1edc0 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1edd0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  r);.    }.    *p
1ede0 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70  nLeaf = pLeaf->p
1edf0 67 6e 6f 2d 31 3b 0a 20 20 20 20 69 66 28 20 70  gno-1;.    if( p
1ee00 4c 65 61 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a  Leaf->pgno>1 ){.
1ee10 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1ee20 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72  lushBtree(p, pWr
1ee30 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iter);.    }.  }
1ee40 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1ee50 65 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b  e(&pLeaf->term);
1ee60 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1ee70 65 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a  e(&pLeaf->buf);.
1ee80 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1ee90 28 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b  (&pLeaf->pgidx);
1eea0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1eeb0 65 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65  e(&pWriter->btte
1eec0 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  rm);..  for(i=0;
1eed0 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   i<pWriter->nDli
1eee0 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  dx; i++){.    sq
1eef0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1ef00 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44  ree(&pWriter->aD
1ef10 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20  lidx[i].buf);.  
1ef20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1ef30 28 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  (pWriter->aDlidx
1ef40 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1ef50 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  d fts5WriteInit(
1ef60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ef70 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1ef80 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
1ef90 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63  nt iSegid.){.  c
1efa0 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72  onst int nBuffer
1efb0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1efc0 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
1efd0 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73  PADDING;..  mems
1efe0 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
1eff0 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
1f000 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
1f010 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1f020 64 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44  d;..  fts5WriteD
1f030 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
1f040 74 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74  ter, 1);.  pWrit
1f050 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20  er->writer.pgno 
1f060 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
1f070 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1f080 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1f090 3e 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20  >iBtPage = 1;.. 
1f0a0 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1f0b0 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d  ->writer.buf.n==
1f0c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1f0d0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1f0e0 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20  gidx.n==0 );..  
1f0f0 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20  /* Grow the two 
1f100 62 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20  buffers to pgsz 
1f110 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20  + padding bytes 
1f120 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71  in size. */.  sq
1f130 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1f140 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1f150 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1f160 64 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20  dx, nBuffer);.  
1f170 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1f180 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70  rSize(&p->rc, &p
1f190 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f1a0 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20  uf, nBuffer);.. 
1f1b0 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74   if( p->pIdxWrit
1f1c0 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  er==0 ){.    Fts
1f1d0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1f1e0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1f1f0 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
1f200 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
1f210 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74  IdxWriter, sqlit
1f220 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
1f230 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1f240 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27  TO '%q'.'%q_idx'
1f250 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f  (segid,term,pgno
1f260 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22  ) VALUES(?,?,?)"
1f270 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  , .          pCo
1f280 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
1f290 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
1f2a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
1f2b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f2c0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1f2d0 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65  ze the 4-byte le
1f2e0 61 66 2d 70 61 67 65 20 68 65 61 64 65 72 20 74  af-page header t
1f2f0 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d  o 0x00. */.    m
1f300 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77  emset(pWriter->w
1f310 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20  riter.buf.p, 0, 
1f320 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  4);.    pWriter-
1f330 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20  >writer.buf.n = 
1f340 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20  4;..    /* Bind 
1f350 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70  the current outp
1f360 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f  ut segment id to
1f370 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65   the index-write
1f380 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20  r. This is an.  
1f390 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
1f3a0 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74  n over binding t
1f3b0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76  he same value ov
1f3c0 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72  er and over as r
1f3d0 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  ows are.    ** i
1f3e0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69  nserted into %_i
1f3f0 64 78 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  dx by the curren
1f400 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20  t writer.  */.  
1f410 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1f420 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  nt(p->pIdxWriter
1f430 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  , 1, pWriter->iS
1f440 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  egid);.  }.}../*
1f450 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1f460 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
1f470 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1f480 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
1f490 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
1f4a0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
1f4b0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
1f4c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f4d0 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
1f4e0 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
1f4f0 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
1f500 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
1f510 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
1f520 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
1f530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f540 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1f550 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
1f560 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
1f570 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
1f580 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
1f590 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
1f5a0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
1f5b0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
1f5c0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
1f5d0 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49  +){.    Fts5SegI
1f5e0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
1f5f0 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
1f600 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d   if( pSeg->pSeg=
1f610 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  =0 ){.      /* n
1f620 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
1f630 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61  e if( pSeg->pLea
1f640 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  f==0 ){.      /*
1f650 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74   All keys from t
1f660 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  his input segmen
1f670 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e  t have been tran
1f680 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75  sfered to the ou
1f690 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53  tput..      ** S
1f6a0 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73  et both the firs
1f6b0 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d  t and last page-
1f6c0 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20  numbers to 0 to 
1f6d0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1f6e0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
1f6f0 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e  nt is now empty.
1f700 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   */.      pSeg->
1f710 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1f720 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
1f730 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1f740 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f750 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1f760 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1f770 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
1f780 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
1f790 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
1f7a0 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
1f7b0 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
1f7c0 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1f7d0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
1f7e0 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
1f7f0 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
1f800 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
1f810 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20   0x00, 0x00};.. 
1f820 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
1f830 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1f840 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e  OWID(iId, pSeg->
1f850 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
1f860 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
1f870 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c  s5DataRead(p, iL
1f880 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1f890 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
1f8a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1f8b0 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20  Zero(&buf);.    
1f8c0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1f8d0 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ow(&p->rc, &buf,
1f8e0 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20   pData->nn);.   
1f8f0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f900 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1f910 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61  , &buf, sizeof(a
1f920 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20  Hdr), aHdr);.   
1f930 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f940 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1f950 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e  rc, &buf, pSeg->
1f960 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20  term.n);.       
1f970 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1f980 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1f990 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
1f9a0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b  , pSeg->term.p);
1f9b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f9c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1f9d0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1f9e0 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20  a->szLeaf-iOff, 
1f9f0 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
1fa00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
1fa10 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1fa20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1fa30 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69  et the szLeaf fi
1fa40 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eld */.         
1fa50 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75 66   fts5PutU16(&buf
1fa60 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e  .p[2], (u16)buf.
1fa70 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  n);.        }.. 
1fa80 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70         /* Set up
1fa90 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e   the new page-in
1faa0 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  dex array */.   
1fab0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fac0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fad0 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20  rc, &buf, 4);.  
1fae0 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
1faf0 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d  iLeafPgno==pSeg-
1fb00 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a  >iTermLeafPgno .
1fb10 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
1fb20 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
1fb30 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20  pData->szLeaf . 
1fb40 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1fb50 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20      int nDiff = 
1fb60 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20  pData->szLeaf - 
1fb70 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1fb80 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
1fb90 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1fba0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
1fbb0 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20  uf, buf.n - 1 - 
1fbc0 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20  nDiff - 4);.    
1fbd0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fbe0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fbf0 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20  c, &buf, .      
1fc00 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e          pData->n
1fc10 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78  n - pSeg->iPgidx
1fc20 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70  Off, &pData->p[p
1fc30 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a  Seg->iPgidxOff].
1fc40 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1fc50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1fc60 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1fc70 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
1fc80 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
1fc90 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
1fca0 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
1fcb0 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
1fcc0 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
1fcd0 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31  ENT_ROWID(iId, 1
1fce0 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  ), iLeafRowid);.
1fcf0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1fd00 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f  Write(p, iLeafRo
1fd10 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  wid, buf.p, buf.
1fd20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1fd30 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  }.  }.  fts5Buff
1fd40 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
1fd50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1fd60 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62  5MergeChunkCallb
1fd70 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
1fd80 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43   *p, .  void *pC
1fd90 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  tx, .  const u8 
1fda0 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
1fdb0 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67  unk.){.  Fts5Seg
1fdc0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
1fdd0 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65 72  = (Fts5SegWriter
1fde0 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72  *)pCtx;.  fts5Wr
1fdf0 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
1fe00 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c  Data(p, pWriter,
1fe10 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
1fe20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
1fe30 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1fe40 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20  dexMergeLevel(. 
1fe50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1fe80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1fe90 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1fea0 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
1feb0 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65  IN/OUT: Stucture
1fec0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
1fed0 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fef0 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  * Level to read 
1ff00 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  input from */.  
1ff10 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20  int *pnRem      
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 74  /* Write up to t
1ff40 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20  his many output 
1ff50 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46  leaves */.){.  F
1ff60 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1ff70 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1ff80 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  t;.  Fts5Structu
1ff90 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
1ffa0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1ffb0 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74  [iLvl];.  Fts5St
1ffc0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
1ffd0 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 74 65  vlOut;.  Fts5Ite
1ffe0 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20  r *pIter = 0;   
1fff0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
20000 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61  to read input da
20010 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  ta */.  int nRem
20020 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65   = pnRem ? *pnRe
20030 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75  m : 0;  /* Outpu
20040 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  t leaf pages lef
20050 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
20060 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20  int nInput;     
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
20090 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
200a0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
200b0 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
200c0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
200d0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
200e0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
200f0 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  g;     /* Output
20100 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
20110 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20  s5Buffer term;. 
20120 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20   int bOldest;   
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
20150 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
20160 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a  s the oldest */.
20170 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
20180 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
20190 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ail;.  const int
201a0 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44   flags = FTS5IND
201b0 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
201c0 54 3b 0a 20 20 69 6e 74 20 62 54 65 72 6d 57 72  T;.  int bTermWr
201d0 69 74 74 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  itten = 0;      
201e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
201f0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 6c 72  current term alr
20200 65 61 64 79 20 6f 75 74 70 75 74 20 2a 2f 0a 0a  eady output */..
20210 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
20220 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
20230 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c  ;.  assert( pLvl
20240 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
20250 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  nSeg );..  memse
20260 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69  t(&writer, 0, si
20270 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
20280 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er));.  memset(&
20290 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
202a0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
202b0 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
202c0 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20   ){.    pLvlOut 
202d0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
202e0 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20  el[iLvl+1];.    
202f0 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d  assert( pLvlOut-
20300 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e  >nSeg>0 );.    n
20310 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  Input = pLvl->nM
20320 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20 3d  erge;.    pSeg =
20330 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
20340 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d  pLvlOut->nSeg-1]
20350 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
20360 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
20370 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a   pSeg->iSegid);.
20380 20 20 20 20 77 72 69 74 65 72 2e 77 72 69 74 65      writer.write
20390 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  r.pgno = pSeg->p
203a0 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77  gnoLast+1;.    w
203b0 72 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d 20  riter.iBtPage = 
203c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
203d0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73  int iSegid = fts
203e0 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
203f0 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20  , pStruct);..   
20400 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46   /* Extend the F
20410 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
20420 65 63 74 20 61 73 20 72 65 71 75 69 72 65 64 20  ect as required 
20430 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75  to ensure the ou
20440 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d  tput.    ** segm
20450 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20  ent exists. */. 
20460 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74     if( iLvl==pSt
20470 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29  ruct->nLevel-1 )
20480 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
20490 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
204a0 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b  ->rc, ppStruct);
204b0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d  .      pStruct =
204c0 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
204d0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
204e0 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
204f0 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
20500 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20  iLvl+1, 1, 0);. 
20510 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
20520 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20  eturn;.    pLvl 
20530 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
20540 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c  el[iLvl];.    pL
20550 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  vlOut = &pStruct
20560 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d  ->aLevel[iLvl+1]
20570 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
20580 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
20590 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
205a0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
205b0 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
205c0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
205d0 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
205e0 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
205f0 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f  nSeg];.    pLvlO
20600 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
20610 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
20620 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69  = 1;.    pSeg->i
20630 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
20640 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
20650 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  gment++;..    /*
20660 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
20670 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
20680 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
20690 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   */.    nInput =
206a0 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d   pLvl->nSeg;.  }
206b0 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c  .  bOldest = (pL
206c0 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26  vlOut->nSeg==1 &
206d0 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
206e0 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61  l==iLvl+2);..  a
206f0 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29  ssert( iLvl>=0 )
20700 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74  ;.  for(fts5Mult
20710 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
20720 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  uct, flags, 0, 0
20730 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
20740 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
20750 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
20760 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
20770 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
20780 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
20790 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
207a0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
207b0 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
207c0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
207d0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
207e0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20800 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
20810 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
20820 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
20830 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
20840 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
20850 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d     pTerm = fts5M
20860 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
20870 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20  er, &nTerm);.   
20880 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
20890 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
208a0 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
208b0 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m) ){.      if( 
208c0 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e  pnRem && writer.
208d0 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65  nLeafWritten>nRe
208e0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  m ){.        bre
208f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20900 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
20910 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
20920 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
20930 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e      bTermWritten
20940 20 3d 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   =0;.    }..    
20950 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79  /* Check for key
20960 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a   annihilation. *
20970 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 49 74  /.    if( pSegIt
20980 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28  er->nPos==0 && (
20990 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49  bOldest || pSegI
209a0 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20  ter->bDel==0) ) 
209b0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 69  continue;..    i
209c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
209d0 5f 4f 4b 20 26 26 20 62 54 65 72 6d 57 72 69 74  _OK && bTermWrit
209e0 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ten==0 ){.      
209f0 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77  /* This is a new
20a00 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20   term. Append a 
20a10 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70  term to the outp
20a20 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
20a30 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
20a40 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
20a50 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
20a60 6d 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d 57  m);.      bTermW
20a70 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ritten = 1;.    
20a80 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
20a90 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
20aa0 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
20ab0 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20ac0 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  IZE */.    fts5W
20ad0 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
20ae0 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35  p, &writer, fts5
20af0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
20b00 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  Iter));..    if(
20b10 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
20b20 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
20b30 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
20b40 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->bDel ){.      
20b50 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20b60 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
20b70 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
20b80 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
20b90 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
20ba0 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Pos>0 ){.       
20bb0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20bc0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
20bd0 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
20be0 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
20bf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
20c10 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
20c20 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
20c30 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
20c40 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67       nPos = pSeg
20c50 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70  Iter->nPos*2 + p
20c60 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20  SegIter->bDel;. 
20c70 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20c80 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
20c90 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
20ca0 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20  er.buf, nPos);. 
20cb0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
20cc0 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74 65  erate(p, pSegIte
20cd0 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65  r, (void*)&write
20ce0 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e  r, fts5MergeChun
20cf0 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  kCallback);.    
20d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  }.  }..  /* Flus
20d10 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
20d20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
20d30 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
20d40 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
20d50 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
20d60 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
20d70 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
20d80 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
20d90 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
20da0 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e  iter, &pSeg->pgn
20db0 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
20dc0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
20dd0 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
20de0 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
20df0 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
20e00 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
20e10 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
20e20 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
20e30 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
20e40 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
20e50 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
20e60 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d  p, pLvl->aSeg[i]
20e70 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a  .iSegid);.    }.
20e80 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
20e90 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
20ea0 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ments from the i
20eb0 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
20ec0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
20ed0 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  !=nInput ){.    
20ee0 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70    int nMove = (p
20ef0 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70  Lvl->nSeg - nInp
20f00 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ut) * sizeof(Fts
20f10 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
20f20 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  t);.      memmov
20f30 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70  e(pLvl->aSeg, &p
20f40 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74  Lvl->aSeg[nInput
20f50 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d  ], nMove);.    }
20f60 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
20f70 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74  egment -= nInput
20f80 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67  ;.    pLvl->nSeg
20f90 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
20fa0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30  pLvl->nMerge = 0
20fb0 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
20fc0 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  pgnoLast==0 ){. 
20fd0 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53       pLvlOut->nS
20fe0 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72  eg--;.      pStr
20ff0 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b  uct->nSegment--;
21000 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21010 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
21020 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a  ->pgnoLast>0 );.
21030 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d      fts5TrimSegm
21040 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  ents(p, pIter);.
21050 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
21060 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a   = nInput;.  }..
21070 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
21080 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74  ree(pIter);.  ft
21090 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
210a0 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
210b0 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
210c0 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
210d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
210e0 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
210f0 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
21100 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  on the index..**
21110 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
21120 69 66 20 61 6e 79 20 63 68 61 6e 67 65 73 20 77  if any changes w
21130 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d 61 64  ere actually mad
21140 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
21150 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
21160 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 4d 65   int fts5IndexMe
21170 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
21180 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
21190 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
211a0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
211b0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
211c0 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
211d0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
211e0 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
211f0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
21200 74 20 6e 50 67 2c 20 20 20 20 20 20 20 20 20 20  t nPg,          
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21220 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74   Pages of work t
21230 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  o do */.  int nM
21240 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
21250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
21260 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
21270 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
21280 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65   */.){.  int nRe
21290 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62  m = nPg;.  int b
212a0 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 53  Ret = 0;.  Fts5S
212b0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
212c0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
212d0 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26   while( nRem>0 &
212e0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
212f0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
21300 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
21310 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
21320 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
21330 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
21340 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
21350 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
21360 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
21370 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
21380 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
21390 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
213a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
213b0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
213c0 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
213d0 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
213e0 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
213f0 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
21400 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
21410 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
21420 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
21430 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
21440 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
21450 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
21460 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
21470 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
21480 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
21490 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
214a0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
214b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
214c0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
214d0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
214e0 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
214f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
21500 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
21510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21520 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21530 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
21540 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
21550 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
21560 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
21570 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
21580 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
21590 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
215a0 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
215b0 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
215c0 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
215d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
215e0 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
215f0 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
21600 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
21610 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
21620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21630 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21640 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
21650 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
21660 20 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e    if( nBest<nMin
21670 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
21680 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
21690 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erge==0 ){.     
216a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
216b0 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20    bRet = 1;.    
216c0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
216d0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
216e0 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
216f0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
21700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21710 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21720 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
21730 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
21740 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
21750 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
21760 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
21770 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
21780 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 72 65 74  = pStruct;.  ret
21790 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn bRet;.}../*.
217a0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
217b0 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
217c0 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
217d0 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
217e0 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
217f0 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
21800 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
21810 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
21820 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
21830 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20  f.** necessary, 
21840 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
21850 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e  ntal merge work.
21860 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21870 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
21880 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
21890 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
218a0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
218b0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
218c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
218d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
218e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
218f0 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20  ndexAutomerge(. 
21900 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
21930 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
21940 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
21950 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
21960 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
21970 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
21980 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  ex */.  int nLea
21990 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
219a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
219b0 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76  r of output leav
219c0 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  es just written 
219d0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
219e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
219f0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
21a00 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20  omerge>0 ){.    
21a10 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21a20 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
21a30 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69  ct;.    u64 nWri
21a40 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
21a50 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
21a60 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
21a70 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
21a80 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21aa0 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
21ab0 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
21ac0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
21ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21ae0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21af0 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
21b00 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
21b10 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
21b20 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
21b30 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
21b40 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
21b50 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
21b60 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
21b70 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
21b80 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b  (int)(((nWrite +
21b90 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
21ba0 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
21bb0 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
21bc0 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ));.    pStruct-
21bd0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
21be0 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65  = nLeaf;.    nRe
21bf0 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f  m = (int)(p->nWo
21c00 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
21c10 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
21c20 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65  );..    fts5Inde
21c30 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75  xMerge(p, ppStru
21c40 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f  ct, nRem, p->pCo
21c50 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
21c60 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
21c70 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43   void fts5IndexC
21c80 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74  risismerge(.  Ft
21c90 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21cb0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
21cc0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
21cd0 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
21ce0 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct        /* IN/
21cf0 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
21d00 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
21d10 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
21d20 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70  t nCrisis = p->p
21d30 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d  Config->nCrisisM
21d40 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75  erge;.  Fts5Stru
21d50 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
21d60 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e   *ppStruct;.  in
21d70 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61  t iLvl = 0;..  a
21d80 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
21d90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
21da0 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
21db0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
21dc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
21dd0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
21de0 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73  l].nSeg>=nCrisis
21df0 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
21e00 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
21e10 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30  pStruct, iLvl, 0
21e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21e30 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
21e40 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
21e50 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20  el>(iLvl+1) );. 
21e60 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
21e70 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
21e80 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
21e90 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
21ea0 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
21eb0 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ct;.}..static in
21ec0 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  t fts5IndexRetur
21ed0 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
21ee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
21ef0 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  c;.  p->rc = SQL
21f00 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
21f10 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
21f20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
21f30 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78  Ctx Fts5FlushCtx
21f40 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  ;.struct Fts5Flu
21f50 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e  shCtx {.  Fts5In
21f60 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73  dex *pIdx;.  Fts
21f70 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
21f80 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75  r; .};../*.** Bu
21f90 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74  ffer aBuf[] cont
21fa0 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76  ains a list of v
21fb0 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c  arints, all smal
21fc0 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a  l enough to fit.
21fd0 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  ** in a 32-bit i
21fe0 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74  nteger. Return t
21ff0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c  he size of the l
22000 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66  argest prefix of
22010 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e   this .** list n
22020 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73  Max bytes or les
22030 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
22040 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
22050 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74  listPrefix(const
22060 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e   u8 *aBuf, int n
22070 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  Max){.  int ret;
22080 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20  .  u32 dummy;.  
22090 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  ret = fts5GetVar
220a0 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d  int32(aBuf, dumm
220b0 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d  y);.  if( ret<nM
220c0 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  ax ){.    while(
220d0 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
220e0 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  i = fts5GetVarin
220f0 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20  t32(&aBuf[ret], 
22100 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66  dummy);.      if
22110 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d  ( (ret + i) > nM
22120 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ax ) break;.    
22130 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20    ret += i;.    
22140 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
22150 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  et;.}../*.** Flu
22160 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
22170 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  of in-memory has
22180 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f  h table iHash to
22190 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a   a new level-0 .
221a0 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69  ** segment on di
221b0 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20  sk. Also update 
221c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
221d0 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  g structure reco
221e0 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
221f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
22200 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
22210 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
22220 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
22230 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
22240 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
22250 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
22260 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
22270 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46  s5FlushOneHash(F
22280 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
22290 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20  Fts5Hash *pHash 
222a0 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74  = p->pHash;.  Ft
222b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
222c0 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67  ruct;.  int iSeg
222d0 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61  id;.  int pgnoLa
222e0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
222f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
22300 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
22310 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a   in segment */..
22320 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65    /* Obtain a re
22330 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
22340 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
22350 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
22360 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a  w segment-id.  *
22370 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65  * for the new le
22380 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20  vel-0 segment.  
22390 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  */.  pStruct = f
223a0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
223b0 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20  (p);.  iSegid = 
223c0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
223d0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  d(p, pStruct);. 
223e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
223f0 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
22400 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
22410 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
22420 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
22430 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65  gsz;.    int eDe
22440 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
22450 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20  g->eDetail;.    
22460 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
22470 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
22480 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
22490 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
224a0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
224b0 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
224c0 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
224d0 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
224e0 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
224f0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
22500 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  idx;           /
22510 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
22520 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67  h to assemble pg
22530 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35  idx */..    Fts5
22540 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
22550 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ;.    fts5WriteI
22560 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
22570 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42  iSegid);..    pB
22580 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  uf = &writer.wri
22590 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67  ter.buf;.    pPg
225a0 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72  idx = &writer.wr
225b0 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20  iter.pgidx;..   
225c0 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69   /* fts5WriteIni
225d0 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20  t() should have 
225e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  initialized the 
225f0 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74  buffers to (most
22600 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20   likely).    ** 
22610 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
22620 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  e required. */. 
22630 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
22640 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65   || pBuf->nSpace
22650 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  >=(pgsz + FTS5_D
22660 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a  ATA_PADDING) );.
22670 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
22680 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70  c || pPgidx->nSp
22690 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
226a0 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
226b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  );..    /* Begin
226c0 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
226d0 68 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74  h hash table ent
226e0 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20  ries. This loop 
226f0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
22700 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64  ch.    ** term/d
22710 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79  oclist currently
22720 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
22730 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
22740 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
22750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22760 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
22770 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49  te3Fts5HashScanI
22780 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29  nit(pHash, 0, 0)
22790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
227a0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
227b0 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
227c0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
227d0 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20  (pHash) ){.     
227e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
227f0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
22800 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
22810 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  g term */.      
22820 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69  const u8 *pDocli
22830 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  st;         /* P
22840 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
22850 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  t for this term 
22860 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  */.      int nDo
22870 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
22880 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22890 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  doclist in bytes
228a0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72   */..      /* Wr
228b0 69 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72  ite the term for
228c0 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64   this entry to d
228d0 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  isk. */.      sq
228e0 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
228f0 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a  nEntry(pHash, &z
22900 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c  Term, &pDoclist,
22910 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20   &nDoclist);.   
22920 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
22930 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65  ndTerm(p, &write
22940 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  r, (int)strlen(z
22950 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38  Term), (const u8
22960 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20  *)zTerm);..     
22970 20 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e   assert( writer.
22980 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
22990 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
229a0 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e  ( pgsz>=(pBuf->n
229b0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
229c0 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a  Doclist + 1) ){.
229d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
229e0 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
229f0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
22a00 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
22a10 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
22a20 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
22a30 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20  pBuf, pDoclist, 
22a40 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
22a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22a60 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a  i64 iRowid = 0;.
22a70 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
22a80 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ta = 0;.        
22a90 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
22aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
22ab0 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c  tire doclist wil
22ac0 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69  l not fit on thi
22ad0 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c  s leaf. The foll
22ae0 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  owing .        *
22af0 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20  * loop iterates 
22b00 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c  through the posl
22b10 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75  ists that make u
22b20 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  p the current . 
22b30 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73         ** doclis
22b40 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  t.  */.        w
22b50 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
22b60 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e  ITE_OK && iOff<n
22b70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
22b80 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
22b90 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63  5GetVarint(&pDoc
22ba0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34  list[iOff], (u64
22bb0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
22bc0 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20        iRowid += 
22bd0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
22be0 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
22bf0 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f   writer.bFirstRo
22c00 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
22c10 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74           fts5Put
22c20 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c  U16(&pBuf->p[0],
22c30 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20   (u16)pBuf->n); 
22c40 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64    /* first rowid
22c50 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
22c60 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
22c70 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
22c80 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
22c90 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69  [pBuf->n], iRowi
22ca0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
22cb0 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
22cc0 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
22cd0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
22ce0 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
22cf0 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69  , &writer, iRowi
22d00 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  d);.          }e
22d10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
22d20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
22d30 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
22d40 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
22d50 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20  n], iDelta);.   
22d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d70 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
22d80 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
22d90 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69   );..          i
22da0 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
22db0 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22dd0 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26  iOff<nDoclist &&
22de0 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d   pDoclist[iOff]=
22df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22e00 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66      pBuf->p[pBuf
22e10 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  ->n++] = 0;.    
22e20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
22e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22e40 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73  if( iOff<nDoclis
22e50 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f  t && pDoclist[iO
22e60 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
22e70 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
22e80 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30  p[pBuf->n++] = 0
22e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22ea0 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
22eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22ed0 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
22ee0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70   + pPgidx->n)>=p
22ef0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
22f00 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
22f10 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74  ushLeaf(p, &writ
22f20 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
22f30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
22f40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22f50 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
22f60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
22f70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
22f80 74 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65  t nCopy = fts5Ge
22f90 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44  tPoslistSize(&pD
22fa0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e  oclist[iOff], &n
22fb0 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
22fc0 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
22fd0 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
22fe0 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
22ff0 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  >n + pPgidx->n +
23000 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20   nCopy) <= pgsz 
23010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23020 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
23030 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oslist will fit 
23040 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
23050 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20  eaf. So copy.   
23060 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
23070 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20   in one go. */. 
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
23090 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
230a0 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f  dBlob(pBuf, &pDo
230b0 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f  clist[iOff], nCo
230c0 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  py);.           
230d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
230e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
230f0 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
23100 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
23110 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65   leaf. So it nee
23120 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ds.             
23130 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e   ** to be broken
23140 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20   into sections. 
23150 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69  The only qualifi
23160 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20  cation being.   
23170 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
23180 61 74 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d  at each varint m
23190 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f  ust be stored co
231a0 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a  ntiguously.  */.
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
231c0 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74  nst u8 *pPoslist
231d0 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66   = &pDoclist[iOf
231e0 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f];.            
231f0 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a    int iPos = 0;.
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
23210 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
23220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23230 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70           int nSp
23240 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75  ace = pgsz - pBu
23250 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e  f->n - pPgidx->n
23260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23270 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23290 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c   (nCopy - iPos)<
232a0 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  =nSpace ){.     
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
232c0 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20   nCopy - iPos;. 
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
232e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
232f0 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35          n = fts5
23300 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70  PoslistPrefix(&p
23310 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e  Poslist[iPos], n
23320 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
23330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23340 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23350 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( n>0 );.       
23360 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
23370 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
23380 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73  b(pBuf, &pPoslis
23390 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20  t[iPos], n);.   
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
233b0 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
233c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
233d0 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
233e0 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  )>=pgsz ){.     
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
23400 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
23410 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23440 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29  f( iPos>=nCopy )
23450 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23480 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b    iOff += nCopy;
23490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
234a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
234b0 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20        /* TODO2: 
234c0 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74  Doclist terminat
234d0 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e  or written here.
234e0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75   */.      /* pBu
234f0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
23500 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20  = '\0'; */.     
23510 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
23520 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
23530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
23540 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
23550 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20  pHash);.    }.  
23560 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
23570 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20  hClear(pHash);. 
23580 20 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69     fts5WriteFini
23590 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
235a0 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
235b0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
235c0 73 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20  s5Structure. It 
235d0 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
235e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
235f0 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74  by the.    ** ft
23600 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
23610 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e  se() call below.
23620 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
23630 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
23640 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
23650 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
23660 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29  p->rc, &pStruct)
23670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
23680 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
23690 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
236a0 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  ruct, 0, 1, 0);.
236b0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
236c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
236d0 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
236e0 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
236f0 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
23700 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
23710 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
23720 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
23730 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
23740 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53  st = 1;.      pS
23750 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70  eg->pgnoLast = p
23760 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70  gnoLast;.      p
23770 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
23780 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ++;.    }.    ft
23790 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
237a0 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74  te(p, 0, pStruct
237b0 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e  );.  }..  fts5In
237c0 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20  dexAutomerge(p, 
237d0 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61  &pStruct, pgnoLa
237e0 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  st);.  fts5Index
237f0 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26  Crisismerge(p, &
23800 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
23810 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
23820 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74  , pStruct);.  ft
23830 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
23840 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a  se(pStruct);.}..
23850 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
23860 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
23870 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
23880 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  h tables to the 
23890 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
238a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
238b0 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65  exFlush(Fts5Inde
238c0 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65  x *p){.  /* Unle
238d0 73 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20  ss it is empty, 
238e0 66 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74  flush the hash t
238f0 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  able to disk */.
23900 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e    if( p->nPendin
23910 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73  gData ){.    ass
23920 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b  ert( p->pHash );
23930 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
23940 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74  Data = 0;.    ft
23950 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70  s5FlushOneHash(p
23960 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
23970 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23980 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  fts5IndexOptimiz
23990 65 53 74 72 75 63 74 28 0a 20 20 46 74 73 35 49  eStruct(.  Fts5I
239a0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
239b0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
239c0 63 74 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  ct.){.  Fts5Stru
239d0 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
239e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73  .  int nByte = s
239f0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
23a00 75 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65 67  ure);.  int nSeg
23a10 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67   = pStruct->nSeg
23a20 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ment;.  int i;..
23a30 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
23a40 69 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  if this structur
23a50 65 20 72 65 71 75 69 72 65 73 20 6f 70 74 69 6d  e requires optim
23a60 69 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72 75 63  ization. A struc
23a70 74 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e  ture does.  ** n
23a80 6f 74 20 72 65 71 75 69 72 65 20 6f 70 74 69 6d  ot require optim
23a90 69 7a 61 74 69 6f 6e 20 69 66 20 65 69 74 68 65  ization if eithe
23aa0 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20  r:.  **.  **  + 
23ab0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 66  it consists of f
23ac0 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 73 65  ewer than two se
23ad0 67 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a 2a  gments, or .  **
23ae0 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73    + all segments
23af0 20 61 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65   are on the same
23b00 20 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20   level, or.  ** 
23b10 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20   + all segments 
23b20 65 78 63 65 70 74 20 6f 6e 65 20 61 72 65 20 63  except one are c
23b30 75 72 72 65 6e 74 6c 79 20 69 6e 70 75 74 73 20  urrently inputs 
23b40 74 6f 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61  to a merge opera
23b50 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
23b60 49 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73  In the first cas
23b70 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  e, return NULL. 
23b80 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 69  In the second, i
23b90 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
23ba0 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a  -count.  ** on *
23bb0 70 53 74 72 75 63 74 20 61 6e 64 20 72 65 74 75  pStruct and retu
23bc0 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  rn a copy of the
23bd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a   pointer to it..
23be0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 3c    */.  if( nSeg<
23bf0 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
23c00 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75  for(i=0; i<pStru
23c10 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  ct->nLevel; i++)
23c20 7b 0a 20 20 20 20 69 6e 74 20 6e 54 68 69 73 20  {.    int nThis 
23c30 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
23c40 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 69  l[i].nSeg;.    i
23c50 66 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20 7c  f( nThis==nSeg |
23c60 7c 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d 31  | (nThis==nSeg-1
23c70 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
23c80 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e  vel[i].nMerge==n
23c90 54 68 69 73 29 20 29 7b 0a 20 20 20 20 20 20 66  This) ){.      f
23ca0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
23cb0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
23cc0 72 65 74 75 72 6e 20 70 53 74 72 75 63 74 3b 0a  return pStruct;.
23cd0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23ce0 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ( pStruct->aLeve
23cf0 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68  l[i].nMerge<=nTh
23d00 69 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79  is );.  }..  nBy
23d10 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e  te += (pStruct->
23d20 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65  nLevel+1) * size
23d30 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
23d40 4c 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20 3d  Level);.  pNew =
23d50 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a   (Fts5Structure*
23d60 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
23d70 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
23d80 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 4e  Byte);..  if( pN
23d90 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  ew ){.    Fts5St
23da0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
23db0 76 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  vl;.    nByte = 
23dc0 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
23dd0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
23de0 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nt);.    pNew->n
23df0 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
23e00 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70  >nLevel+1;.    p
23e10 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
23e20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43     pNew->nWriteC
23e30 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74  ounter = pStruct
23e40 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  ->nWriteCounter;
23e50 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65  .    pLvl = &pNe
23e60 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63  w->aLevel[pStruc
23e70 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  t->nLevel];.    
23e80 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
23e90 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
23ea0 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
23eb0 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63  allocZero(&p->rc
23ec0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
23ed0 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a  ( pLvl->aSeg ){.
23ee0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
23ef0 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  iSeg;.      int 
23f00 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20  iSegOut = 0;.   
23f10 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
23f20 72 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d 65 6e  rough all segmen
23f30 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20  ts, from oldest 
23f40 74 6f 20 6e 65 77 65 73 74 2e 20 41 64 64 20 74  to newest. Add t
23f50 68 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  hem to.      ** 
23f60 74 68 65 20 6e 65 77 20 46 74 73 35 4c 65 76 65  the new Fts5Leve
23f70 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  l object so that
23f80 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d 20 69   pLvl->aSeg[0] i
23f90 73 20 74 68 65 20 6f 6c 64 65 73 74 0a 20 20 20  s the oldest.   
23fa0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e     ** segment in
23fb0 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
23fc0 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  ure.  */.      f
23fd0 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75 63 74 2d  or(iLvl=pStruct-
23fe0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76 6c 3e  >nLevel-1; iLvl>
23ff0 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20 20 20  =0; iLvl--){.   
24000 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
24010 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
24020 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
24030 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
24040 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
24050 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
24060 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
24070 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
24080 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b         iSegOut++
24090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
240a0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
240b0 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d  nSegment = pLvl-
240c0 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20  >nSeg = nSeg;.  
240d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
240e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
240f0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
24100 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
24110 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
24120 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24130 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
24140 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
24150 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
24160 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
24170 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
24180 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
24190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
241a0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
241b0 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
241c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
241d0 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72  ad(p);.  fts5Str
241e0 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
241f0 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72  (p);..  if( pStr
24200 75 63 74 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  uct ){.    pNew 
24210 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d  = fts5IndexOptim
24220 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74  izeStruct(p, pSt
24230 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73  ruct);.  }.  fts
24240 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
24250 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 61  e(pStruct);..  a
24260 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30 20 7c  ssert( pNew==0 |
24270 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74  | pNew->nSegment
24280 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  >0 );.  if( pNew
24290 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
242a0 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ;.    for(iLvl=0
242b0 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  ; pNew->aLevel[i
242c0 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 4c  Lvl].nSeg==0; iL
242d0 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68 69 6c  vl++){}.    whil
242e0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
242f0 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65  _OK && pNew->aLe
24300 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30  vel[iLvl].nSeg>0
24310 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
24320 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f  em = FTS5_OPT_WO
24330 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66  RK_UNIT;.      f
24340 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
24350 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76  el(p, &pNew, iLv
24360 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d  l, &nRem);.    }
24370 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ..    fts5Struct
24380 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77  ureWrite(p, pNew
24390 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
243a0 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77  tureRelease(pNew
243b0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
243c0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
243d0 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (p); .}../*.** T
243e0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  his is called to
243f0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
24400 70 65 63 69 61 6c 20 22 56 41 4c 55 45 53 28 27  pecial "VALUES('
24410 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72 67 65 29  merge', $nMerge)
24420 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f 6d 6d  ".** INSERT comm
24430 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
24440 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67  te3Fts5IndexMerg
24450 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
24460 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46  int nMerge){.  F
24470 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
24480 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
24490 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
244a0 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
244b0 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 2d     int nMin = p-
244c0 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d  >pConfig->nUserm
244d0 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35 53 74  erge;.    fts5St
244e0 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
244f0 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d  e(p);.    if( nM
24500 65 72 67 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  erge<0 ){.      
24510 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
24520 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f  New = fts5IndexO
24530 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c  ptimizeStruct(p,
24540 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20   pStruct);.     
24550 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24560 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24570 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20        pStruct = 
24580 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d 69 6e  pNew;.      nMin
24590 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d 65 72   = 2;.      nMer
245a0 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31 3b 0a  ge = nMerge*-1;.
245b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
245c0 74 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74  truct && pStruct
245d0 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  ->nLevel ){.    
245e0 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 4d    if( fts5IndexM
245f0 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
24600 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 20  , nMerge, nMin) 
24610 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
24620 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
24630 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20   pStruct);.     
24640 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
24650 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
24660 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
24670 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24680 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
24690 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
246a0 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
246b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
246c0 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73  64 iDelta,.  Fts
246d0 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 2c 0a  5Iter *pUnused,.
246e0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
246f0 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  uf.){.  UNUSED_P
24700 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
24710 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
24720 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
24730 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 7d  pBuf, iDelta);.}
24740 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
24750 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 28  s5AppendPoslist(
24760 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24770 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20  .  i64 iDelta,. 
24780 20 46 74 73 35 49 74 65 72 20 2a 70 4d 75 6c 74   Fts5Iter *pMult
24790 69 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i,.  Fts5Buffer 
247a0 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 6e  *pBuf.){.  int n
247b0 44 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e 62  Data = pMulti->b
247c0 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61 73 73  ase.nData;.  ass
247d0 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a  ert( nData>0 );.
247e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
247f0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73  ITE_OK && 0==fts
24800 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
24810 72 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2b  rc, pBuf, nData+
24820 39 2b 39 29 20 29 7b 0a 20 20 20 20 66 74 73 35  9+9) ){.    fts5
24830 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
24840 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65  Varint(pBuf, iDe
24850 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35 42 75  lta);.    fts5Bu
24860 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
24870 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61 74 61  rint(pBuf, nData
24880 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  *2);.    fts5Buf
24890 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
248a0 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d 3e  b(pBuf, pMulti->
248b0 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44 61 74  base.pData, nDat
248c0 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74  a);.  }.}...stat
248d0 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
248e0 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
248f0 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
24900 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70  er){.  u8 *p = p
24910 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b  Iter->aPoslist +
24920 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20   pIter->nSize + 
24930 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
24940 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
24950 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20  r->aPoslist );. 
24960 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61   if( p>=pIter->a
24970 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  Eof ){.    pIter
24980 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
24990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
249a0 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20   iDelta;..    p 
249b0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
249c0 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  (p, (u64*)&iDelt
249d0 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
249e0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
249f0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f  ..    /* Read po
24a00 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
24a10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d   */.    if( p[0]
24a20 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
24a30 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
24a40 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20   pIter->nSize = 
24a50 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
24a60 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  p, nPos);.      
24a70 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
24a80 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20  = (nPos>>1);.   
24a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
24aa0 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
24ab0 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e  ((int)(p[0])) >>
24ac0 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   1;.      pIter-
24ad0 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  >nSize = 1;.    
24ae0 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  }..    pIter->aP
24af0 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a  oslist = p;.  }.
24b00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
24b10 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
24b20 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
24b30 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44   *pBuf, .  Fts5D
24b40 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
24b50 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  r.){.  memset(pI
24b60 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
24b70 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
24b80 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75  ->aPoslist = pBu
24b90 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61  f->p;.  pIter->a
24ba0 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70  Eof = &pBuf->p[p
24bb0 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44  Buf->n];.  fts5D
24bc0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
24bd0 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a  Iter);.}..#if 0.
24be0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64  /*.** Append a d
24bf0 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72  oclist to buffer
24c00 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
24c10 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
24c20 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69  es that space wi
24c30 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  thin the buffer 
24c40 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
24c50 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  .** allocated..*
24c60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
24c70 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
24c80 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  id(.  Fts5Buffer
24c90 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
24ca0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
24cb0 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
24cc0 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69   i64 *piLastRowi
24cd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24ce0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76   /* IN/OUT: Prev
24cf0 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74  ious rowid writt
24d00 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  en (if any) */. 
24d10 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20   i64 iRowid     
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70   /* Rowid to app
24d40 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  end */.){.  asse
24d50 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c  rt( pBuf->n!=0 |
24d60 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29  | (*piLastRowid)
24d70 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66  ==0 );.  fts5Buf
24d80 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
24d90 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64  int(pBuf, iRowid
24da0 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
24db0 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  ;.  *piLastRowid
24dc0 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e   = iRowid;.}.#en
24dd0 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  dif..#define fts
24de0 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
24df0 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77  d(pBuf, iLastRow
24e00 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20  id, iRowid) {   
24e10 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
24e20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20  (pBuf)->n!=0 || 
24e30 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20  (iLastRowid)==0 
24e40 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
24e50 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66       \.  fts5Buf
24e60 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
24e70 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f  int((pBuf), (iRo
24e80 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77  wid) - (iLastRow
24e90 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74  id)); \.  (iLast
24ea0 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64  Rowid) = (iRowid
24eb0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
24ee0 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65  * Swap the conte
24ef0 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70  nts of buffer *p
24f00 31 20 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a  1 with that of *
24f10 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p2..*/.static vo
24f20 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61  id fts5BufferSwa
24f30 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31  p(Fts5Buffer *p1
24f40 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32  , Fts5Buffer *p2
24f50 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ){.  Fts5Buffer 
24f60 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31  tmp = *p1;.  *p1
24f70 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20   = *p2;.  *p2 = 
24f80 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tmp;.}..static v
24f90 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69  oid fts5NextRowi
24fa0 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  d(Fts5Buffer *pB
24fb0 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20  uf, int *piOff, 
24fc0 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20  i64 *piRowid){. 
24fd0 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b   int i = *piOff;
24fe0 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e  .  if( i>=pBuf->
24ff0 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20  n ){.    *piOff 
25000 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
25010 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
25020 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71   *piOff = i + sq
25030 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
25040 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20  nt(&pBuf->p[i], 
25050 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52  &iVal);.    *piR
25060 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
25070 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
25080 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
25090 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72  t of fts5MergePr
250a0 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20  efixLists() for 
250b0 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65  detail=none mode
250c0 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73  ..** In this cas
250d0 65 20 74 68 65 20 62 75 66 66 65 72 73 20 63 6f  e the buffers co
250e0 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61  nsist of a delta
250f0 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66  -encoded list of
25100 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f   rowids only..*/
25110 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
25120 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73  5MergeRowidLists
25130 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
25140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25150 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
25160 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
25170 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
251a0 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
251b0 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
251c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
251d0 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
251e0 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rge */.){.  int 
251f0 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32  i1 = 0;.  int i2
25200 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77   = 0;.  i64 iRow
25210 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69  id1 = 0;.  i64 i
25220 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36  Rowid2 = 0;.  i6
25230 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46  4 iOut = 0;..  F
25240 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20  ts5Buffer out;. 
25250 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
25260 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
25270 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
25280 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
25290 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d  out, p1->n + p2-
252a0 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  >n);.  if( p->rc
252b0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74   ) return;..  ft
252c0 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20  s5NextRowid(p1, 
252d0 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a  &i1, &iRowid1);.
252e0 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
252f0 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64  p2, &i2, &iRowid
25300 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e  2);.  while( i1>
25310 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20  =0 || i2>=0 ){. 
25320 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20     if( i1>=0 && 
25330 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31  (i2<0 || iRowid1
25340 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20  <iRowid2) ){.   
25350 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d     assert( iOut=
25360 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f  =0 || iRowid1>iO
25370 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ut );.      fts5
25380 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
25390 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f  Varint(&out, iRo
253a0 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20  wid1 - iOut);.  
253b0 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69      iOut = iRowi
253c0 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65  d1;.      fts5Ne
253d0 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c  xtRowid(p1, &i1,
253e0 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20   &iRowid1);.    
253f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25400 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20  ert( iOut==0 || 
25410 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a  iRowid2>iOut );.
25420 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
25430 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
25440 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d  (&out, iRowid2 -
25450 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f   iOut);.      iO
25460 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20  ut = iRowid2;.  
25470 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26      if( i1>=0 &&
25480 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64   iRowid1==iRowid
25490 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  2 ){.        fts
254a0 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
254b0 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
254c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
254d0 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26  5NextRowid(p2, &
254e0 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20  i2, &iRowid2);. 
254f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
25500 42 75 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c  BufferSwap(&out,
25510 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66   p1);.  fts5Buff
25520 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a  erFree(&out);.}.
25530 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70  ./*.** Buffers p
25540 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e  1 and p2 contain
25550 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20   doclists. This 
25560 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20  function merges 
25570 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
25580 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73  f the two doclis
25590 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20  ts together and 
255a0 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74  sets buffer p1 t
255b0 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66  o the result bef
255c0 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
255d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
255e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
255f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
25600 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61  t in p->rc. If a
25610 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61  n error has.** a
25620 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
25630 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25640 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
25650 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
25660 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a  rgePrefixLists(.
25670 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
256a0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
256b0 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
256d0 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
256e0 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
256f0 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
25700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
25710 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
25720 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32  e */.){.  if( p2
25730 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ->n ){.    i64 i
25740 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
25750 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
25760 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44  er i1;.    Fts5D
25770 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20  oclistIter i2;. 
25780 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75     Fts5Buffer ou
25790 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20  t = {0, 0, 0};. 
257a0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d     Fts5Buffer tm
257b0 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  p = {0, 0, 0};..
257c0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
257d0 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  um size of the o
257e0 75 74 70 75 74 20 69 73 20 65 71 75 61 6c 20 74  utput is equal t
257f0 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
25800 20 74 77 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 70   two .    ** inp
25810 75 74 20 73 69 7a 65 73 20 2b 20 31 20 76 61 72  ut sizes + 1 var
25820 69 6e 74 20 28 39 20 62 79 74 65 73 29 2e 20 54  int (9 bytes). T
25830 68 65 20 65 78 74 72 61 20 76 61 72 69 6e 74 20  he extra varint 
25840 69 73 20 62 65 63 61 75 73 65 20 69 66 20 74 68  is because if th
25850 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 72  e.    ** first r
25860 6f 77 69 64 20 69 6e 20 6f 6e 65 20 69 6e 70 75  owid in one inpu
25870 74 20 69 73 20 61 20 6c 61 72 67 65 20 6e 65 67  t is a large neg
25880 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 61 6e  ative number, an
25890 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 0a 20  d the first in. 
258a0 20 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20     ** the other 
258b0 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e  a non-negative n
258c0 75 6d 62 65 72 2c 20 74 68 65 20 64 65 6c 74 61  umber, the delta
258d0 20 66 6f 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67   for the non-neg
258e0 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  ative.    ** num
258f0 62 65 72 20 77 69 6c 6c 20 62 65 20 6c 61 72 67  ber will be larg
25900 65 72 20 6f 6e 20 64 69 73 6b 20 74 68 61 6e 20  er on disk than 
25910 74 68 65 20 6c 69 74 65 72 61 6c 20 69 6e 74 65  the literal inte
25920 67 65 72 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  ger value.    **
25930 20 77 61 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66   was.  */.    if
25940 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  ( sqlite3Fts5Buf
25950 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
25960 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32  &out, p1->n + p2
25970 2d 3e 6e 20 2b 20 39 29 20 29 20 72 65 74 75 72  ->n + 9) ) retur
25980 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  n;.    fts5Docli
25990 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 26  stIterInit(p1, &
259a0 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  i1);.    fts5Doc
259b0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c  listIterInit(p2,
259c0 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68 69 6c   &i2);..    whil
259d0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
259e0 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69  ( i1.iRowid<i2.i
259f0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
25a00 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
25a10 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
25a20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
25a30 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
25a40 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
25a50 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
25a60 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25a70 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
25a80 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
25a90 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a  list+i1.nSize);.
25aa0 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
25ab0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
25ac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
25ad0 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62  .aPoslist==0 ) b
25ae0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25af0 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e      else if( i2.
25b00 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69  iRowid!=i1.iRowi
25b10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
25b20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
25b30 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i2 */.        ft
25b40 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
25b50 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
25b60 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
25b70 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
25b80 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
25b90 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
25ba0 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  ist, i2.nPoslist
25bb0 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i2.nSize);.    
25bc0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
25bd0 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
25be0 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
25bf0 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
25c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
25c20 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70   Merge the two p
25c30 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a  osition lists. *
25c40 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  / .        i64 i
25c50 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos1 = 0;.      
25c60 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b    i64 iPos2 = 0;
25c70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
25c80 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f1 = 0;.        
25c90 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20  int iOff2 = 0;. 
25ca0 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20         u8 *a1 = 
25cb0 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e  &i1.aPoslist[i1.
25cc0 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  nSize];.        
25cd0 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f  u8 *a2 = &i2.aPo
25ce0 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b  slist[i2.nSize];
25cf0 0a 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50  ..        i64 iP
25d00 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
25d10 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
25d20 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 20  er writer;.     
25d30 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65     memset(&write
25d40 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69  r, 0, sizeof(wri
25d50 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  ter));..        
25d60 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
25d70 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
25d80 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
25d90 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
25da0 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b  ufferZero(&tmp);
25db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25dc0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
25dd0 70 2d 3e 72 63 2c 20 26 74 6d 70 2c 20 69 31 2e  p->rc, &tmp, i1.
25de0 6e 50 6f 73 6c 69 73 74 20 2b 20 69 32 2e 6e 50  nPoslist + i2.nP
25df0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
25e00 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
25e10 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c  ak;..        sql
25e20 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
25e30 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
25e40 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
25e50 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
25e60 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
25e70 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e  stNext64(a2, i2.
25e80 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32  nPoslist, &iOff2
25e90 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  , &iPos2);.     
25ea0 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 31     assert( iPos1
25eb0 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20  >=0 && iPos2>=0 
25ec0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
25ed0 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20  iPos1<iPos2 ){. 
25ee0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25ef0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
25f00 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
25f10 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
25f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
25f30 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
25f40 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
25f50 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
25f60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25f70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25f80 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
25f90 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
25fa0 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20  rev, iPos2);.   
25fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
25fc0 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
25fd0 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  a2, i2.nPoslist,
25fe0 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29   &iOff2, &iPos2)
25ff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
26000 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d       if( iPos1>=
26010 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20 29 7b  0 && iPos2>=0 ){
26020 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
26030 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( 1 ){.         
26040 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f     if( iPos1<iPo
26050 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s2 ){.          
26060 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d 69      if( iPos1!=i
26070 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
26080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
26090 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
260a0 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
260b0 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  v, iPos1);.     
260c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
260d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
260e0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
260f0 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  4(a1, i1.nPoslis
26100 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73  t, &iOff1, &iPos
26110 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
26120 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20 29 20    if( iPos1<0 ) 
26130 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
26140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26150 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26160 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29 3b 0a  iPos2!=iPrev );.
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26180 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26190 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
261a0 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b   &iPrev, iPos2);
261b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
261c0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
261d0 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e  tNext64(a2, i2.n
261e0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c  Poslist, &iOff2,
261f0 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20   &iPos2);.      
26200 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
26210 32 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  2<0 ) break;.   
26220 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26240 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ..        if( iP
26250 6f 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  os1>=0 ){.      
26260 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d 69      if( iPos1!=i
26270 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
26280 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26290 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
262a0 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
262b0 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
262c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
262d0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
262e0 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61 31 5b  dBlob(&tmp, &a1[
262f0 69 4f 66 66 31 5d 2c 20 69 31 2e 6e 50 6f 73 6c  iOff1], i1.nPosl
26300 69 73 74 2d 69 4f 66 66 31 29 3b 0a 20 20 20 20  ist-iOff1);.    
26310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26320 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f       assert( iPo
26330 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32 21 3d  s2>=0 && iPos2!=
26340 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20  iPrev );.       
26350 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26360 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
26370 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
26380 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
26390 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
263a0 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26  pendBlob(&tmp, &
263b0 61 32 5b 69 4f 66 66 32 5d 2c 20 69 32 2e 6e 50  a2[iOff2], i2.nP
263c0 6f 73 6c 69 73 74 2d 69 4f 66 66 32 29 3b 0a 20  oslist-iOff2);. 
263d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
263e0 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
263f0 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
26400 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
26410 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
26420 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20  , tmp.n * 2);.  
26430 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26440 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
26450 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e  out, tmp.p, tmp.
26460 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
26470 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
26480 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
26490 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
264a0 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&i2);.        
264b0 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d  if( i1.aPoslist=
264c0 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73  =0 || i2.aPoslis
264d0 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
264e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
264f0 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
26500 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65   ){.      fts5Me
26510 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
26520 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
26530 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i1.iRowid);.   
26540 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
26550 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
26560 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
26570 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50 6f 73  1.aEof - i1.aPos
26580 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  list);.    }.   
26590 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61 50 6f   else if( i2.aPo
265a0 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  slist ){.      f
265b0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
265c0 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
265d0 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
265e0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
265f0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26600 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69  (&out, i2.aPosli
26610 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20 69 32  st, i2.aEof - i2
26620 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
26630 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 75  }.    assert( ou
26640 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32 2d 3e  t.n<=(p1->n+p2->
26650 6e 2b 39 29 20 29 3b 0a 0a 20 20 20 20 66 74 73  n+9) );..    fts
26660 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
26670 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75  c, p1, out.n, ou
26680 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  t.p);.    fts5Bu
26690 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a  fferFree(&tmp);.
266a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
266b0 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  ee(&out);.  }.}.
266c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
266d0 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
266e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
266f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26700 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
26710 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
26720 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26740 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45  * True for "ORDE
26750 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
26760 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
26770 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
26780 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
26790 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
267a0 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20  x to match */.  
267b0 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267d0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
267e0 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65  r pToken in byte
267f0 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  s */.  Fts5Colse
26800 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
26810 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
26820 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68  ct matches to th
26830 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ese columns */. 
26840 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 49 74   Fts5Iter **ppIt
26850 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er          /* O
26860 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72  UT: New iterator
26870 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
26880 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
26890 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61  .  Fts5Buffer *a
268a0 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Buf;.  const int
268b0 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 76   nBuf = 32;..  v
268c0 6f 69 64 20 28 2a 78 4d 65 72 67 65 29 28 46 74  oid (*xMerge)(Ft
268d0 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 42 75  s5Index*, Fts5Bu
268e0 66 66 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65  ffer*, Fts5Buffe
268f0 72 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 41  r*);.  void (*xA
26900 70 70 65 6e 64 29 28 46 74 73 35 49 6e 64 65 78  ppend)(Fts5Index
26910 2a 2c 20 69 36 34 2c 20 46 74 73 35 49 74 65 72  *, i64, Fts5Iter
26920 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b  *, Fts5Buffer*);
26930 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69  .  if( p->pConfi
26940 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
26950 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
26960 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73      xMerge = fts
26970 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73  5MergeRowidLists
26980 3b 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20  ;.    xAppend = 
26990 66 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 3b  fts5AppendRowid;
269a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 4d  .  }else{.    xM
269b0 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65  erge = fts5Merge
269c0 50 72 65 66 69 78 4c 69 73 74 73 3b 0a 20 20 20  PrefixLists;.   
269d0 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
269e0 70 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20 20  ppendPoslist;.  
269f0 7d 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73  }..  aBuf = (Fts
26a00 35 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78  5Buffer*)fts5Idx
26a10 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
26a20 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75  (Fts5Buffer)*nBu
26a30 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  f);.  pStruct = 
26a40 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
26a50 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75  d(p);..  if( aBu
26a60 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a  f && pStruct ){.
26a70 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
26a80 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f  ags = FTS5INDEX_
26a90 51 55 45 52 59 5f 53 43 41 4e 20 0a 20 20 20 20  QUERY_SCAN .    
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ab0 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  | FTS5INDEX_QUER
26ac0 59 5f 53 4b 49 50 45 4d 50 54 59 20 0a 20 20 20  Y_SKIPEMPTY .   
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ae0 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   | FTS5INDEX_QUE
26af0 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 20  RY_NOOUTPUT;.   
26b00 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20   int i;.    i64 
26b10 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
26b20 20 20 20 20 46 74 73 35 49 74 65 72 20 2a 70 31      Fts5Iter *p1
26b30 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65   = 0;     /* Ite
26b40 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61  rator used to ga
26b50 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69  ther data from i
26b60 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35  ndex */.    Fts5
26b70 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
26b80 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c   Fts5Buffer docl
26b90 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65  ist;.    int bNe
26ba0 77 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20  wTerm = 1;..    
26bb0 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c  memset(&doclist,
26bc0 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69   0, sizeof(docli
26bd0 73 74 29 29 3b 0a 20 20 20 20 66 74 73 35 4d 75  st));.    fts5Mu
26be0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
26bf0 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 70 43  truct, flags, pC
26c00 6f 6c 73 65 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e  olset, pToken, n
26c10 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70  Token, -1, 0, &p
26c20 31 29 3b 0a 20 20 20 20 66 74 73 35 49 74 65 72  1);.    fts5Iter
26c30 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e  SetOutputCb(&p->
26c40 72 63 2c 20 70 31 29 3b 0a 20 20 20 20 66 6f 72  rc, p1);.    for
26c50 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a  ( /* no-op */ ;.
26c60 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
26c70 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d  iIterEof(p, p1)=
26c80 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
26c90 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70  MultiIterNext2(p
26ca0 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29  , p1, &bNewTerm)
26cb0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 74  .    ){.      Ft
26cc0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
26cd0 3d 20 26 70 31 2d 3e 61 53 65 67 5b 20 70 31 2d  = &p1->aSeg[ p1-
26ce0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
26cf0 74 20 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ];.      int n
26d00 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72  Term = pSeg->ter
26d10 6d 2e 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  m.n;.      const
26d20 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 70 53 65   u8 *pTerm = pSe
26d30 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20 20 20 20 20  g->term.p;.     
26d40 20 70 31 2d 3e 78 53 65 74 4f 75 74 70 75 74 73   p1->xSetOutputs
26d50 28 70 31 2c 20 70 53 65 67 29 3b 0a 0a 20 20 20  (p1, pSeg);..   
26d60 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65     assert_nc( me
26d70 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
26d80 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20  rm, MIN(nToken, 
26d90 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20  nTerm))<=0 );.  
26da0 20 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d      if( bNewTerm
26db0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26dc0 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20  nTerm<nToken || 
26dd0 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
26de0 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20  Term, nToken) ) 
26df0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
26e00 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61        if( p1->ba
26e10 73 65 2e 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f  se.nData==0 ) co
26e20 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 69  ntinue;..      i
26e30 66 28 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77  f( p1->base.iRow
26e40 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 26  id<=iLastRowid &
26e50 26 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 29 7b  & doclist.n>0 ){
26e60 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
26e70 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
26e80 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b  OK && doclist.n;
26e90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
26ea0 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20   assert( i<nBuf 
26eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26ec0 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b   aBuf[i].n==0 ){
26ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
26ee0 35 42 75 66 66 65 72 53 77 61 70 28 26 64 6f 63  5BufferSwap(&doc
26ef0 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
26f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
26f10 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63  5BufferZero(&doc
26f20 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  list);.         
26f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26f40 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64      xMerge(p, &d
26f50 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
26f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
26f70 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61  ts5BufferZero(&a
26f80 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
26f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26fa0 20 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69         iLastRowi
26fb0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  d = 0;.      }..
26fc0 20 20 20 20 20 20 78 41 70 70 65 6e 64 28 70 2c        xAppend(p,
26fd0 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64   p1->base.iRowid
26fe0 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c  -iLastRowid, p1,
26ff0 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   &doclist);.    
27000 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 70    iLastRowid = p
27010 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3b 0a  1->base.iRowid;.
27020 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
27030 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29  =0; i<nBuf; i++)
27040 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
27050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27060 20 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70          xMerge(p
27070 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
27080 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  f[i]);.      }. 
27090 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
270a0 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ree(&aBuf[i]);. 
270b0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c     }.    fts5Mul
270c0 74 69 49 74 65 72 46 72 65 65 28 70 31 29 3b 0a  tiIterFree(p1);.
270d0 0a 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73  .    pData = fts
270e0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
270f0 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b  zeof(Fts5Data) +
27100 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20   doclist.n);.   
27110 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
27120 20 20 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28      pData->p = (
27130 75 38 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20  u8*)&pData[1];. 
27140 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d       pData->nn =
27150 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d   pData->szLeaf =
27160 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20   doclist.n;.    
27170 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 20    if( doclist.n 
27180 29 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e  ) memcpy(pData->
27190 70 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f  p, doclist.p, do
271a0 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20  clist.n);.      
271b0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
271c0 32 28 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73  2(p, pData, bDes
271d0 63 2c 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20  c, ppIter);.    
271e0 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
271f0 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a  Free(&doclist);.
27200 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63    }..  fts5Struc
27210 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
27220 75 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  uct);.  sqlite3_
27230 66 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a  free(aBuf);.}...
27240 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
27250 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65  hat all subseque
27260 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
27270 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
27280 65 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74  e() pertain.** t
27290 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77  o the document w
272a0 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64  ith rowid iRowid
272b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
272c0 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72  Fts5IndexBeginWr
272d0 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
272e0 2c 20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69  , int bDelete, i
272f0 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73  64 iRowid){.  as
27300 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
27310 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
27320 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73  Allocate the has
27330 68 20 74 61 62 6c 65 20 69 66 20 69 74 20 68 61  h table if it ha
27340 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
27350 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
27360 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d    if( p->pHash==
27370 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
27380 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
27390 4e 65 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20  New(p->pConfig, 
273a0 26 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e  &p->pHash, &p->n
273b0 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20  PendingData);.  
273c0 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
273d0 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  e hash table to 
273e0 64 69 73 6b 20 69 66 20 72 65 71 75 69 72 65 64  disk if required
273f0 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64   */.  if( iRowid
27400 3c 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20  <p->iWriteRowid 
27410 0a 20 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d  .   || (iRowid==
27420 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26  p->iWriteRowid &
27430 26 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29  & p->bDelete==0)
27440 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64  .   || (p->nPend
27450 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f  ingData > p->pCo
27460 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29  nfig->nHashSize)
27470 20 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49   .  ){.    fts5I
27480 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
27490 7d 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f  }..  p->iWriteRo
274a0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
274b0 70 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65  p->bDelete = bDe
274c0 6c 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66  lete;.  return f
274d0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
274e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
274f0 69 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e  it data to disk.
27500 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
27510 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73  ts5IndexSync(Fts
27520 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
27530 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
27540 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
27550 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
27560 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
27570 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  (p);.  return ft
27580 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
27590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
275a0 72 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  rd any data stor
275b0 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
275c0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e  ory hash tables.
275d0 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74   Do not write it
275e0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
275f0 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
27600 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
27610 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
27620 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62  he %_data.** tab
27630 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  le may have chan
27640 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ged on disk. So 
27650 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  any in-memory ca
27660 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a  ches of %_data .
27670 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20  ** records must 
27680 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
27690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
276a0 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28  s5IndexRollback(
276b0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
276c0 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
276d0 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  (p);.  fts5Index
276e0 44 69 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a  DiscardData(p);.
276f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
27700 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20  nvalidate(p);.  
27710 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  /* assert( p->rc
27720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a  ==SQLITE_OK ); *
27730 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
27740 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
27750 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
27760 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
27770 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75  pty when this fu
27780 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
27790 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
277a0 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20  on populates it 
277b0 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
277c0 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
277d0 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  ts for each inde
277e0 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  x,.** and the in
277f0 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66  itial version of
27800 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
27810 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62  record (a zero-b
27820 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e  yte blob)..*/.in
27830 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27840 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64  exReinit(Fts5Ind
27850 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
27860 72 75 63 74 75 72 65 20 73 3b 0a 20 20 66 74 73  ructure s;.  fts
27870 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
27880 64 61 74 65 28 70 29 3b 0a 20 20 6d 65 6d 73 65  date(p);.  memse
27890 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
278a0 46 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b  Fts5Structure));
278b0 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
278c0 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
278d0 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20  S_ROWID, (const 
278e0 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74  u8*)"", 0);.  ft
278f0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
27900 28 70 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72  (p, &s);.  retur
27910 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
27920 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n(p);.}../*.** O
27930 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e  pen a new Fts5In
27940 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74  dex handle. If t
27950 68 65 20 62 43 72 65 61 74 65 20 61 72 67 75 6d  he bCreate argum
27960 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72 65  ent is true, cre
27970 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  ate.** and initi
27980 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
27990 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c  ying %_data tabl
279a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
279b0 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20  essful, set *pp 
279c0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
279d0 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  new object and r
279e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
279f0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
27a00 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61  et *pp to NULL a
27a10 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
27a20 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
27a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27a40 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46  s5IndexOpen(.  F
27a50 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
27a60 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61  ig, .  int bCrea
27a70 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78  te, .  Fts5Index
27a80 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a   **pp,.  char **
27a90 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72  pzErr.){.  int r
27aa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27ab0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20   Fts5Index *p;  
27ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ad0 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
27ae0 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28  /..  *pp = p = (
27af0 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74  Fts5Index*)sqlit
27b00 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
27b10 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73  (&rc, sizeof(Fts
27b20 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20  5Index));.  if( 
27b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27b40 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20  .    p->pConfig 
27b50 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70  = pConfig;.    p
27b60 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54  ->nWorkUnit = FT
27b70 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20  S5_WORK_UNIT;.  
27b80 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20    p->zDataTbl = 
27b90 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
27ba0 74 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61  tf(&rc, "%s_data
27bb0 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  ", pConfig->zNam
27bc0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  e);.    if( p->z
27bd0 44 61 74 61 54 62 6c 20 26 26 20 62 43 72 65 61  DataTbl && bCrea
27be0 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  te ){.      rc =
27bf0 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61   sqlite3Fts5Crea
27c00 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20  teTable(.       
27c10 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74     pConfig, "dat
27c20 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20  a", "id INTEGER 
27c30 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f  PRIMARY KEY, blo
27c40 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45  ck BLOB", 0, pzE
27c50 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  rr.      );.    
27c60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
27c80 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
27c90 72 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66  reateTable(pConf
27ca0 69 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20  ig, "idx", .    
27cb0 20 20 20 20 20 20 20 20 22 73 65 67 69 64 2c 20          "segid, 
27cc0 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d  term, pgno, PRIM
27cd0 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74  ARY KEY(segid, t
27ce0 65 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20  erm)", .        
27cf0 20 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20      1, pzErr.   
27d00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
27d10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27d20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
27d40 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70  ts5IndexReinit(p
27d50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27d60 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
27d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
27d80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27d90 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  K );.  if( rc ){
27da0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
27db0 49 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20  IndexClose(p);. 
27dc0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
27dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27de0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61  /*.** Close a ha
27df0 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61  ndle opened by a
27e00 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
27e10 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
27e20 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  exOpen()..*/.int
27e30 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27e40 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78  xClose(Fts5Index
27e50 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
27e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
27e70 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
27e80 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  t( p->pReader==0
27e90 20 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75   );.    fts5Stru
27ea0 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
27eb0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
27ec0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69  finalize(p->pWri
27ed0 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
27ee0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44  3_finalize(p->pD
27ef0 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  eleter);.    sql
27f00 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
27f10 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
27f20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
27f30 7a 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  ze(p->pIdxDelete
27f40 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
27f50 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
27f60 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
27f70 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
27f80 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a  >pDataVersion);.
27f90 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
27fa0 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68  ashFree(p->pHash
27fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27fc0 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29  ree(p->zDataTbl)
27fd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27fe0 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ee(p);.  }.  ret
27ff0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28000 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   Argument p poin
28010 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
28020 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20  ontaining utf-8 
28030 74 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62  text that is n b
28040 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65  ytes in .** size
28050 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
28060 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
28070 74 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63  the nChar charac
28080 74 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68  ter prefix of th
28090 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20  e.** buffer, or 
280a0 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c  0 if there are l
280b0 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63  ess than nChar c
280c0 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74  haracters in tot
280d0 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
280e0 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c  e3Fts5IndexCharl
280f0 65 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63  enToBytelen(.  c
28100 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20  onst char *p, . 
28110 20 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69   int nByte, .  i
28120 6e 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e  nt nChar.){.  in
28130 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  t n = 0;.  int i
28140 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
28150 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
28160 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72  if( n>=nByte ) r
28170 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a  eturn 0;      /*
28180 20 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20   Input contains 
28190 66 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72  fewer than nChar
281a0 20 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66   chars */.    if
281b0 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ( (unsigned char
281c0 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b  )p[n++]>=0xc0 ){
281d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70  .      while( (p
281e0 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38  [n] & 0xc0)==0x8
281f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  0 ){.        n++
28200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e  ;.        if( n>
28210 3d 6e 42 79 74 65 20 29 20 62 72 65 61 6b 3b 0a  =nByte ) break;.
28220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28230 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
28240 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20  ./*.** pIn is a 
28250 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
28260 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20  ring, nIn bytes 
28270 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  in size. Return 
28280 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
28290 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
282a0 65 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  ers in the strin
282b0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
282c0 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
282d0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  n(const char *pI
282e0 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
282f0 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20  nt nChar = 0;   
28300 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
28310 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
28320 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  i<nIn ){.    if(
28330 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
28340 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29  pIn[i++]>=0xc0 )
28350 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
28360 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20  <nIn && (pIn[i] 
28370 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
28380 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  i++;.    }.    n
28390 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Char++;.  }.  re
283a0 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f  turn nChar;.}../
283b0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
283c0 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
283d0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
283e0 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
283f0 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
28400 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
28410 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
28420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28430 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
28440 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
28450 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
28460 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
28470 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
28480 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
28490 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
284a0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
284b0 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
284c0 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
284d0 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
284e0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
284f0 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
28500 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
28510 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
28520 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
28530 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
28540 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
28550 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69  r a delete..*/.i
28560 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28570 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
28580 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
28590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
285a0 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
285b0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
285e0 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
285f0 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
28600 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
28630 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
28640 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
28650 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
28660 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
28670 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
28680 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
28690 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
286a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
286d0 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
286e0 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  xes */.  int rc 
286f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
28700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28710 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
28720 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
28730 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a   = p->pConfig;..
28740 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
28750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28760 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29  assert( (iCol<0)
28770 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a  ==p->bDelete );.
28780 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e  .  /* Add the en
28790 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  try to the main 
287a0 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a  terms index. */.
287b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
287c0 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20  s5HashWrite(.   
287d0 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e     p->pHash, p->
287e0 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
287f0 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41  l, iPos, FTS5_MA
28800 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65  IN_PREFIX, pToke
28810 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a  n, nToken.  );..
28820 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
28830 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26  nfig->nPrefix &&
28840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
28850 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
28860 69 6e 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e  int nChar = pCon
28870 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b  fig->aPrefix[i];
28880 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
28890 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
288a0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
288b0 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
288c0 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66  , nChar);.    if
288d0 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
288e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
288f0 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48  5HashWrite(p->pH
28900 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
28910 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20  p->iWriteRowid, 
28920 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61  iCol, iPos, (cha
28930 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  r)(FTS5_MAIN_PRE
28940 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e  FIX+i+1), pToken
28950 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ,.          nByt
28960 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
28970 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
28980 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
28990 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
289a0 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
289b0 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74  h all rowid that
289c0 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
289d0 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
289e0 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
289f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
28a00 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20  s5IndexQuery(.  
28a10 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
28a40 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  query */.  const
28a50 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
28a60 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f  nt nToken, /* To
28a70 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20  ken (or prefix) 
28a80 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
28a90 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
28ac0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66  5INDEX_QUERY_X f
28ad0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
28ae0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
28af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
28b00 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  ch these columns
28b10 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49   only */.  Fts5I
28b20 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
28b30 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
28b40 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
28b50 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
28b60 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
28b70 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
28b80 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 52 65  .  Fts5Iter *pRe
28b90 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66  t = 0;.  Fts5Buf
28ba0 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c  fer buf = {0, 0,
28bb0 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   0};..  /* If th
28bc0 65 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61  e QUERY_SCAN fla
28bd0 67 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74  g is set, all ot
28be0 68 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62  her flags must b
28bf0 65 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73  e clear. */.  as
28c00 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46  sert( (flags & F
28c10 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
28c20 43 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  CAN)==0 || flags
28c30 3d 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  ==FTS5INDEX_QUER
28c40 59 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28  Y_SCAN );..  if(
28c50 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28c60 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
28c70 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d  buf, nToken+1)==
28c80 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  0 ){.    int iId
28c90 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
28ca0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
28cb0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20  to search */.   
28cc0 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 20 6d 65   if( nToken ) me
28cd0 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20  mcpy(&buf.p[1], 
28ce0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
28cf0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
28d00 6f 75 74 20 77 68 69 63 68 20 69 6e 64 65 78 20  out which index 
28d10 74 6f 20 73 65 61 72 63 68 20 61 6e 64 20 73 65  to search and se
28d20 74 20 69 49 64 78 20 61 63 63 6f 72 64 69 6e 67  t iIdx according
28d30 6c 79 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ly. If this.    
28d40 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 71  ** is a prefix q
28d50 75 65 72 79 20 66 6f 72 20 77 68 69 63 68 20 74  uery for which t
28d60 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69  here is no prefi
28d70 78 20 69 6e 64 65 78 2c 20 73 65 74 20 69 49 64  x index, set iId
28d80 78 20 74 6f 0a 20 20 20 20 2a 2a 20 67 72 65 61  x to.    ** grea
28d90 74 65 72 20 74 68 61 6e 20 70 43 6f 6e 66 69 67  ter than pConfig
28da0 2d 3e 6e 50 72 65 66 69 78 20 74 6f 20 69 6e 64  ->nPrefix to ind
28db0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 71  icate that the q
28dc0 75 65 72 79 20 77 69 6c 6c 20 62 65 0a 20 20 20  uery will be.   
28dd0 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 62 79   ** satisfied by
28de0 20 73 63 61 6e 6e 69 6e 67 20 6d 75 6c 74 69 70   scanning multip
28df0 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
28e00 6d 61 69 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  main index..    
28e10 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
28e20 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44   QUERY_TEST_NOID
28e30 58 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69  X flag was speci
28e40 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  fied, then this 
28e50 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20 2a 2a  must be a.    **
28e60 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e 20 49   prefix-query. I
28e70 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20  nstead of using 
28e80 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78 20 28  a prefix-index (
28e90 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29 2c 20  if one exists), 
28ea0 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61 74 65  .    ** evaluate
28eb0 20 74 68 65 20 70 72 65 66 69 78 20 71 75 65 72   the prefix quer
28ec0 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e  y using the main
28ed0 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68 69 73   FTS index. This
28ee0 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   is used.    ** 
28ef0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e  for internal san
28f00 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62 79 20  ity checking by 
28f10 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
28f20 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a 20 20  eck in debug .  
28f30 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20    ** mode only. 
28f40 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
28f50 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
28f60 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78  pConfig->bPrefix
28f70 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61  Index==0 || (fla
28f80 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
28f90 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29  UERY_TEST_NOIDX)
28fa0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28fb0 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
28fc0 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
28fd0 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   );.      iIdx =
28fe0 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   1+pConfig->nPre
28ff0 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  fix;.    }else.#
29000 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c  endif.    if( fl
29010 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
29020 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a  QUERY_PREFIX ){.
29030 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20        int nChar 
29040 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
29050 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  en(pToken, nToke
29060 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49  n);.      for(iI
29070 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e  dx=1; iIdx<=pCon
29080 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
29090 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  dx++){.        i
290a0 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  f( pConfig->aPre
290b0 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68  fix[iIdx-1]==nCh
290c0 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ar ) break;.    
290d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
290e0 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  f( iIdx<=pConfig
290f0 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ->nPrefix ){.   
29100 20 20 20 2f 2a 20 53 74 72 61 69 67 68 74 20 69     /* Straight i
29110 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  ndex lookup */. 
29120 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
29130 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74  re *pStruct = ft
29140 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
29150 70 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b  p);.      buf.p[
29160 30 5d 20 3d 20 28 75 38 29 28 46 54 53 35 5f 4d  0] = (u8)(FTS5_M
29170 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
29180 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  x);.      if( pS
29190 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20  truct ){.       
291a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
291b0 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
291c0 61 67 73 20 7c 20 46 54 53 35 49 4e 44 45 58 5f  ags | FTS5INDEX_
291d0 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 2c  QUERY_SKIPEMPTY,
291e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43   .            pC
291f0 6f 6c 73 65 74 2c 20 62 75 66 2e 70 2c 20 6e 54  olset, buf.p, nT
29200 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26  oken+1, -1, 0, &
29210 70 52 65 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  pRet.        );.
29220 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75          fts5Stru
29230 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
29240 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ruct);.      }. 
29250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29260 2f 2a 20 53 63 61 6e 20 6d 75 6c 74 69 70 6c 65  /* Scan multiple
29270 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61   terms in the ma
29280 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  in index */.    
29290 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66    int bDesc = (f
292a0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
292b0 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b  _QUERY_DESC)!=0;
292c0 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20  .      buf.p[0] 
292d0 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  = FTS5_MAIN_PREF
292e0 49 58 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  IX;.      fts5Se
292f0 74 75 70 50 72 65 66 69 78 49 74 65 72 28 70 2c  tupPrefixIter(p,
29300 20 62 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e   bDesc, buf.p, n
29310 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74  Token+1, pColset
29320 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20  , &pRet);.      
29330 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
29340 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74  QLITE_OK || pRet
29350 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a  ->pColset==0 );.
29360 20 20 20 20 20 20 66 74 73 35 49 74 65 72 53 65        fts5IterSe
29370 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63  tOutputCb(&p->rc
29380 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 69  , pRet);.      i
29390 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
293a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46  _OK ){.        F
293b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
293c0 20 3d 20 26 70 52 65 74 2d 3e 61 53 65 67 5b 70   = &pRet->aSeg[p
293d0 52 65 74 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  Ret->aFirst[1].i
293e0 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20 20  First];.        
293f0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20  if( pSeg->pLeaf 
29400 29 20 70 52 65 74 2d 3e 78 53 65 74 4f 75 74 70  ) pRet->xSetOutp
29410 75 74 73 28 70 52 65 74 2c 20 70 53 65 67 29 3b  uts(pRet, pSeg);
29420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
29430 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b      if( p->rc ){
29440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
29450 73 35 49 74 65 72 43 6c 6f 73 65 28 28 46 74 73  s5IterClose((Fts
29460 35 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74  5IndexIter*)pRet
29470 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
29480 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f  0;.      fts5Clo
29490 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
294a0 20 7d 0a 0a 20 20 20 20 2a 70 70 49 74 65 72 20   }..    *ppIter 
294b0 3d 20 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  = (Fts5IndexIter
294c0 2a 29 70 52 65 74 3b 0a 20 20 20 20 73 71 6c 69  *)pRet;.    sqli
294d0 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
294e0 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72  e(&buf);.  }.  r
294f0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
29500 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
29510 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
29520 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
29530 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
29540 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74  y argument is at
29550 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d   EOF..*/./*.** M
29560 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
29570 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
29580 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
29590 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
295a0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
295b0 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74  xIter){.  Fts5It
295c0 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
295d0 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
295e0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  r;.  assert( pIt
295f0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
29600 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
29610 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
29620 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
29630 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pIter, 0, 0);.  
29640 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
29650 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
29660 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
29670 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
29680 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72   matching term/r
29690 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68  owid. Used by th
296a0 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
296b0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
296c0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63  e3Fts5IterNextSc
296d0 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  an(Fts5IndexIter
296e0 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20   *pIndexIter){. 
296f0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
29700 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
29710 6e 64 65 78 49 74 65 72 3b 0a 20 20 46 74 73 35  ndexIter;.  Fts5
29720 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
29730 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73  ->pIndex;..  ass
29740 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
29750 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
29760 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  K );..  fts5Mult
29770 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
29780 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  er, 0, 0);.  if(
29790 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
297a0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
297b0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
297c0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
297d0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
297e0 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  st ];.    if( pS
297f0 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
29800 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54  g->term.p[0]!=FT
29810 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29  S5_MAIN_PREFIX )
29820 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
29830 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c  Release(pSeg->pL
29840 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67  eaf);.      pSeg
29850 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
29860 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62     pIter->base.b
29870 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
29880 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73   }..  return fts
29890 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
298a0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
298b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
298c0 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
298d0 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72  rowid that occur
298e0 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d  s at or after iM
298f0 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66  atch. The.** def
29900 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f  inition of "at o
29910 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73  r after" depends
29920 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73   on whether this
29930 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74   iterator iterat
29940 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  es.** in ascendi
29950 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67  ng or descending
29960 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f   rowid order..*/
29970 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
29980 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73  IterNextFrom(Fts
29990 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
299a0 65 78 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74  exIter, i64 iMat
299b0 63 68 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20  ch){.  Fts5Iter 
299c0 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74  *pIter = (Fts5It
299d0 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a  er*)pIndexIter;.
299e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
299f0 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70  extFrom(pIter->p
29a00 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69 4d  Index, pIter, iM
29a10 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e 20  atch);.  return 
29a20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
29a30 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
29a40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29a50 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
29a60 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
29a70 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  *sqlite3Fts5Iter
29a80 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74  Term(Fts5IndexIt
29a90 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20  er *pIndexIter, 
29aa0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20  int *pn){.  int 
29ab0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
29ac0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
29ad0 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
29ae0 65 72 6d 28 28 46 74 73 35 49 74 65 72 2a 29 70  erm((Fts5Iter*)p
29af0 49 6e 64 65 78 49 74 65 72 2c 20 26 6e 29 3b 0a  IndexIter, &n);.
29b00 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72    *pn = n-1;.  r
29b10 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a  eturn &z[1];.}..
29b20 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
29b30 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
29b40 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
29b50 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
29b60 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
29b70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
29b80 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
29b90 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78  ndexIter *pIndex
29ba0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 6e  Iter){.  if( pIn
29bb0 64 65 78 49 74 65 72 20 29 7b 0a 20 20 20 20 46  dexIter ){.    F
29bc0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
29bd0 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64   (Fts5Iter*)pInd
29be0 65 78 49 74 65 72 3b 0a 20 20 20 20 46 74 73 35  exIter;.    Fts5
29bf0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
29c00 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20  pIter->pIndex;. 
29c10 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
29c20 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20  Free(pIter);.   
29c30 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
29c40 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a  (pIndex);.  }.}.
29c50 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  ./*.** Read and 
29c60 64 65 63 6f 64 65 20 74 68 65 20 22 61 76 65 72  decode the "aver
29c70 61 67 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f  ages" record fro
29c80 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
29c90 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
29ca0 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69   anSize must poi
29cb0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  nt to an array o
29cc0 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65  f size nCol, whe
29cd0 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68  re nCol is.** th
29ce0 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
29cf0 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
29d00 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
29d10 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
29d20 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
29d30 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
29d40 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20  *p, i64 *pnRow, 
29d50 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20  i64 *anSize){.  
29d60 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43  int nCol = p->pC
29d70 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46  onfig->nCol;.  F
29d80 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
29d90 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20  .  *pnRow = 0;. 
29da0 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20   memset(anSize, 
29db0 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a  0, sizeof(i64) *
29dc0 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20   nCol);.  pData 
29dd0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
29de0 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
29df0 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d  ROWID);.  if( p-
29e00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
29e10 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  & pData->nn ){. 
29e20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
29e30 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
29e40 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
29e50 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
29e60 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20   (u64*)pnRow);. 
29e70 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
29e80 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43  <pData->nn && iC
29e90 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  ol<nCol; iCol++)
29ea0 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  {.      i += fts
29eb0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
29ec0 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26  a->p[i], (u64*)&
29ed0 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20  anSize[iCol]);. 
29ee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
29ef0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
29f00 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
29f10 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
29f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
29f30 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
29f40 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
29f50 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
29f60 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
29f70 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
29f80 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
29f90 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29fa0 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
29fb0 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
29fc0 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
29fd0 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
29fe0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
29ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2a000 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
2a010 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
2a020 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20  S_ROWID, pData, 
2a030 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  nData);.  return
2a040 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
2a050 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
2a060 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
2a070 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
2a080 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
2a090 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
2a0a0 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
2a0b0 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
2a0c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2a0d0 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
2a0e0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
2a0f0 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
2a100 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
2a110 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69  the 32-bit cooki
2a120 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61  e value stored a
2a130 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
2a140 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  ll structure .**
2a150 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
2a160 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2a170 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2a180 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
2a190 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
2a1a0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
2a1b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2a1c0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
2a1d0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
2a1e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2a1f0 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
2a200 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65  ndex *p, int iNe
2a210 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  w){.  int rc;   
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2a240 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
2a250 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
2a260 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
2a270 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
2a280 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
2a290 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20   u8 aCookie[4]; 
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20        /* Binary 
2a2c0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2a2d0 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69  f iNew */.  sqli
2a2e0 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20  te3_blob *pBlob 
2a2f0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
2a300 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2a310 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73   );.  sqlite3Fts
2a320 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20  5Put32(aCookie, 
2a330 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73  iNew);..  rc = s
2a340 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
2a350 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43  (pConfig->db, pC
2a360 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
2a370 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
2a380 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54  "block", FTS5_ST
2a390 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31  RUCTURE_ROWID, 1
2a3a0 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20  , &pBlob.  );.  
2a3b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a3c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2a3d0 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
2a3e0 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30  b, aCookie, 4, 0
2a3f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2a400 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
2a410 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Blob);.  }..  re
2a420 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
2a430 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2a440 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
2a450 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
2a460 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
2a470 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  ct;.  pStruct = 
2a480 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
2a490 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  d(p);.  fts5Stru
2a4a0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
2a4b0 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
2a4c0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
2a4d0 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  p);.}.../*******
2a4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a520 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2a530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2a570 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
2a580 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
2a590 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
2a5a0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a  ntegrity-check .
2a5b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ** functionality
2a5c0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
2a5d0 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63  rn a simple chec
2a5e0 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64  ksum value based
2a5f0 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   on the argument
2a600 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65  s..*/.u64 sqlite
2a610 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2a620 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77  ksum(.  i64 iRow
2a630 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  id, .  int iCol,
2a640 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20   .  int iPos, . 
2a650 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
2a660 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a  st char *pTerm,.
2a670 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20    int nTerm.){. 
2a680 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65   int i;.  u64 re
2a690 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  t = iRowid;.  re
2a6a0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
2a6b0 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28  iCol;.  ret += (
2a6c0 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a  ret<<3) + iPos;.
2a6d0 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20    if( iIdx>=0 ) 
2a6e0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2a6f0 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  + (FTS5_MAIN_PRE
2a700 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66  FIX + iIdx);.  f
2a710 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
2a720 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
2a730 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d  t<<3) + pTerm[i]
2a740 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
2a750 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2a760 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
2a770 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
2a780 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
2a790 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
2a7a0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
2a7b0 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
2a7c0 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
2a7d0 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
2a7e0 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
2a7f0 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
2a800 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
2a810 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
2a820 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
2a830 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
2a840 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
2a850 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
2a860 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
2a870 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
2a880 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64  meters.** iSegid
2a890 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74  /iLeaf is iterat
2a8a0 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f  ed in forwards o
2a8b0 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  r reverse order.
2a8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a8d0 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
2a8e0 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
2a8f0 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65  x *p, .  int iSe
2a900 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
2a910 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
2a920 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66  ent id to load f
2a930 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  rom */.  int iLe
2a940 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
2a950 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
2a960 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
2a970 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
2a980 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
2a990 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a  er *pDlidx = 0;.
2a9a0 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31    u64 cksum1 = 1
2a9b0 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20  3;.  u64 cksum2 
2a9c0 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c  = 13;..  for(pDl
2a9d0 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
2a9e0 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
2a9f0 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20  id, iLeaf);.    
2aa00 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
2aa10 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
2aa20 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2aa30 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
2aa40 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  idx).  ){.    i6
2aa50 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44  4 iRowid = fts5D
2aa60 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
2aa70 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70  lidx);.    int p
2aa80 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
2aa90 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
2aaa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2aab0 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  o>iLeaf );.    c
2aac0 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20  ksum1 += iRowid 
2aad0 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32  + ((i64)pgno<<32
2aae0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
2aaf0 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
2ab00 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
2ab10 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d  ;..  for(pDlidx=
2ab20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
2ab30 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20  t(p, 1, iSegid, 
2ab40 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74  iLeaf);.      ft
2ab50 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
2ab60 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
2ab70 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2ab80 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29  rPrev(p, pDlidx)
2ab90 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
2aba0 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78  owid = fts5Dlidx
2abb0 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
2abc0 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20  );.    int pgno 
2abd0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
2abe0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
2abf0 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
2ac00 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
2ac10 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  x)>iLeaf );.    
2ac20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64  cksum2 += iRowid
2ac30 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33   + ((i64)pgno<<3
2ac40 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c  2);.  }.  fts5Dl
2ac50 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
2ac60 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  dx);.  pDlidx = 
2ac70 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
2ac80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
2ac90 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70  sum1!=cksum2 ) p
2aca0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2acb0 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  UPT;.}..static i
2acc0 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73 75  nt fts5QueryCksu
2acd0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
2ace0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2acf0 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64       /* Fts5 ind
2ad00 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
2ad10 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
2ad20 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
2ad30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ad40 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79  dex key to query
2ad50 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c   for */.  int n,
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2ad80 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69  e of index key i
2ad90 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
2ada0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2adc0 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e  Flags for Fts5In
2add0 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36  dexQuery */.  u6
2ade0 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20  4 *pCksum       
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae00 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75   IN/OUT: Checksu
2ae10 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  m value */.){.  
2ae20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
2ae30 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
2ae40 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d  l;.  u64 cksum =
2ae50 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35   *pCksum;.  Fts5
2ae60 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
2ae70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
2ae80 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2ae90 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20  xQuery(p, z, n, 
2aea0 66 6c 61 67 73 2c 20 30 2c 20 26 70 49 74 65 72  flags, 0, &pIter
2aeb0 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  );..  while( rc=
2aec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
2aed0 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  =sqlite3Fts5Iter
2aee0 45 6f 66 28 70 49 74 65 72 29 20 29 7b 0a 20 20  Eof(pIter) ){.  
2aef0 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 70 49    i64 rowid = pI
2af00 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  ter->iRowid;..  
2af10 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
2af20 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
2af30 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20 5e  ){.      cksum ^
2af40 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2af50 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
2af60 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c 20  id, 0, 0, iIdx, 
2af70 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  z, n);.    }else
2af80 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c  {.      Fts5Posl
2af90 69 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65  istReader sReade
2afa0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c  r;.      for(sql
2afb0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
2afc0 65 61 64 65 72 49 6e 69 74 28 70 49 74 65 72 2d  eaderInit(pIter-
2afd0 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 6e  >pData, pIter->n
2afe0 44 61 74 61 2c 20 26 73 52 65 61 64 65 72 29 3b  Data, &sReader);
2aff0 0a 20 20 20 20 20 20 20 20 20 20 73 52 65 61 64  .          sRead
2b000 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20  er.bEof==0;.    
2b010 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2b020 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
2b030 78 74 28 26 73 52 65 61 64 65 72 29 0a 20 20 20  xt(&sReader).   
2b040 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
2b050 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f  t iCol = FTS5_PO
2b060 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72  S2COLUMN(sReader
2b070 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  .iPos);.        
2b080 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f  int iOff = FTS5_
2b090 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61 64  POS2OFFSET(sRead
2b0a0 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
2b0b0 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74    cksum ^= sqlit
2b0c0 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2b0d0 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43 6f  Cksum(rowid, iCo
2b0e0 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20 7a  l, iOff, iIdx, z
2b0f0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
2b100 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
2b130 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65  ts5IterNext(pIte
2b140 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2b150 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
2b160 6c 6f 73 65 28 70 49 74 65 72 29 3b 0a 0a 20 20  lose(pIter);..  
2b170 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b  *pCksum = cksum;
2b180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b190 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2b1a0 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75  ction is also pu
2b1b0 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
2b1c0 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
2b1d0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
2b1e0 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
2b1f0 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
2b200 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
2b210 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
2b220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b230 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20  fts5TestTerm(.  
2b240 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
2b250 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 72   Fts5Buffer *pPr
2b260 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
2b270 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72   /* Previous ter
2b280 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  m */.  const cha
2b290 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20  r *z, int n,    
2b2a0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
2b2b0 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74  ly new term to t
2b2c0 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70  est */.  u64 exp
2b2d0 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43  ected,.  u64 *pC
2b2e0 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ksum.){.  int rc
2b2f0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
2b300 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20  pPrev->n==0 ){. 
2b310 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
2b320 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20  (&rc, pPrev, n, 
2b330 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20  (const u8*)z);. 
2b340 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d   }else.  if( rc=
2b350 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
2b360 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65  Prev->n!=n || me
2b370 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a  mcmp(pPrev->p, z
2b380 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34  , n)) ){.    u64
2b390 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75   cksum3 = *pCksu
2b3a0 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  m;.    const cha
2b3b0 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73  r *zTerm = (cons
2b3c0 74 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e  t char*)&pPrev->
2b3d0 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73  p[1];  /* term s
2b3e0 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65 20  ans prefix-byte 
2b3f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  */.    int nTerm
2b400 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20   = pPrev->n-1;  
2b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2b420 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  e of zTerm in by
2b430 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tes */.    int i
2b440 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b  Idx = (pPrev->p[
2b450 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50  0] - FTS5_MAIN_P
2b460 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20  REFIX);.    int 
2b470 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30  flags = (iIdx==0
2b480 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58   ? 0 : FTS5INDEX
2b490 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a  _QUERY_PREFIX);.
2b4a0 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b      u64 ck1 = 0;
2b4b0 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30  .    u64 ck2 = 0
2b4c0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
2b4d0 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  that the results
2b4e0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53   returned for AS
2b4f0 43 20 61 6e 64 20 44 45 53 43 20 71 75 65 72 69  C and DESC queri
2b500 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  es are.    ** th
2b510 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20  e same. If not, 
2b520 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70  call this corrup
2b530 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63  tion.  */.    rc
2b540 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
2b550 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
2b560 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
2b570 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72  &ck1);.    if( r
2b580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b590 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
2b5a0 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  ags|FTS5INDEX_QU
2b5b0 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
2b5c0 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
2b5d0 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
2b5e0 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
2b5f0 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  k2);.    }.    i
2b600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b610 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
2b620 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2b630 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2b640 73 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75  s is a prefix qu
2b650 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ery, check that 
2b660 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
2b670 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  rned if the.    
2b680 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
2b690 64 69 73 61 62 6c 65 64 20 61 72 65 20 74 68 65  disabled are the
2b6a0 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41   same. In both A
2b6b0 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65  SC and DESC orde
2b6c0 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r. .    **.    *
2b6d0 2a 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79  * This check may
2b6e0 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d   only be perform
2b6f0 65 64 20 69 66 20 74 68 65 20 68 61 73 68 20 74  ed if the hash t
2b700 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54  able is empty. T
2b710 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  his.    ** is be
2b720 63 61 75 73 65 20 74 68 65 20 68 61 73 68 20 74  cause the hash t
2b730 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  able only suppor
2b740 74 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e  ts a single scan
2b750 20 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a   query at.    **
2b760 20 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65   a time, and the
2b770 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70   multi-iter loop
2b780 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73   from which this
2b790 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2b7a0 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c  led.    ** is al
2b7b0 72 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67  ready performing
2b7c0 20 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f   such a scan. */
2b7d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e  .    if( p->nPen
2b7e0 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20  dingData==0 ){. 
2b7f0 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
2b800 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2b810 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2b820 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
2b830 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
2b840 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b  OIDX;.        ck
2b850 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  2 = 0;.        r
2b860 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
2b870 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
2b880 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b  m, nTerm, f, &ck
2b890 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
2b8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b8b0 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
2b8c0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2b8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b8e0 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
2b8f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b900 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
2b910 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
2b920 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53  Y_TEST_NOIDX|FTS
2b930 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
2b940 43 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d  C;.        ck2 =
2b950 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2b960 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
2b970 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
2b980 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
2b990 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2b9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
2b9b0 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
2b9c0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b9d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63    }.    }..    c
2b9e0 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20  ksum3 ^= ck1;.  
2b9f0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
2ba00 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28  &rc, pPrev, n, (
2ba10 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20  const u8*)z);.. 
2ba20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ba30 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d  E_OK && cksum3!=
2ba40 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20  expected ){.    
2ba50 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
2ba60 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  UPT;.    }.    *
2ba70 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b  pCksum = cksum3;
2ba80 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72  .  }.  p->rc = r
2ba90 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64  c;.}. .#else.# d
2baa0 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c  efine fts5TestDl
2bab0 69 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a  idxReverse(x,y,z
2bac0 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54  ).# define fts5T
2bad0 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c  estTerm(u,v,w,x,
2bae0 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
2baf0 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a  ** Check that:.*
2bb00 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65  *.**   1) All le
2bb10 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74  aves of pSeg bet
2bb20 77 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20  ween iFirst and 
2bb30 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
2bb40 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
2bb50 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
2bb60 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20   terms..**   2) 
2bb70 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53  All leaves of pS
2bb80 65 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f  eg between iNoRo
2bb90 77 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69  wid and iLast (i
2bba0 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
2bbb0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
2bbc0 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e  ain zero rowids.
2bbd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2bbe0 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
2bbf0 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
2bc00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
2bc10 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2bc20 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
2bc30 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68  /* Segment to ch
2bc40 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e  eck internal con
2bc50 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e  sistency */.  in
2bc60 74 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20  t iFirst,.  int 
2bc70 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20  iNoRowid,.  int 
2bc80 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69  iLast.){.  int i
2bc90 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63  ;..  /* Now chec
2bca0 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e  k that the iter.
2bcb0 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f  nEmpty leaves fo
2bcc0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72  llowing the curr
2bcd0 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61  ent leaf.  ** (a
2bce0 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
2bcf0 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
2bd00 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69  . */.  for(i=iFi
2bd10 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  rst; p->rc==SQLI
2bd20 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73  TE_OK && i<=iLas
2bd30 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  t; i++){.    Fts
2bd40 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66  5Data *pLeaf = f
2bd50 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
2bd60 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2bd70 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
2bd80 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  i));.    if( pLe
2bd90 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  af ){.      if( 
2bda0 21 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c  !fts5LeafIsTerml
2bdb0 65 73 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e  ess(pLeaf) ) p->
2bdc0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2bdd0 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  T;.      if( i>=
2bde0 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66  iNoRowid && 0!=f
2bdf0 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
2be00 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d  dOff(pLeaf) ) p-
2be10 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2be20 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  PT;.    }.    ft
2be30 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2be40 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  eaf);.  }.}..sta
2be50 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74  tic void fts5Int
2be60 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
2be70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
2be80 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
2be90 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20  .  int iTermOff 
2bea0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a  = 0;.  int ii;..
2beb0 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
2bec0 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46  1 = {0,0,0};.  F
2bed0 74 73 35 42 75 66 66 65 72 20 62 75 66 32 20 3d  ts5Buffer buf2 =
2bee0 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20   {0,0,0};..  ii 
2bef0 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
2bf00 0a 20 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65  .  while( ii<pLe
2bf10 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d  af->nn && p->rc=
2bf20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bf30 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
2bf40 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
2bf50 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20   nIncr;..    ii 
2bf60 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2bf70 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d  32(&pLeaf->p[ii]
2bf80 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54  , nIncr);.    iT
2bf90 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b  ermOff += nIncr;
2bfa0 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
2bfb0 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69  mOff;..    if( i
2bfc0 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
2bfd0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  af ){.      p->r
2bfe0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2bff0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2c000 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20  iTermOff==nIncr 
2c010 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
2c020 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  te;.      iOff +
2c030 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2c040 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
2c050 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2c060 20 69 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65   if( (iOff+nByte
2c070 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  )>pLeaf->szLeaf 
2c080 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
2c090 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2c0a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2c0b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
2c0c0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  Set(&p->rc, &buf
2c0d0 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66  1, nByte, &pLeaf
2c0e0 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
2c0f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2c100 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20       int nKeep, 
2c110 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66  nByte;.      iOf
2c120 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2c130 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2c140 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
2c150 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2c160 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c170 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79  af->p[iOff], nBy
2c180 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  te);.      if( n
2c190 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28  Keep>buf1.n || (
2c1a0 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61  iOff+nByte)>pLea
2c1b0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2c1c0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2c1d0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2c1e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c1f0 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  buf1.n = nKeep;.
2c200 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
2c210 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
2c220 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
2c230 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
2c240 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  f]);.      }..  
2c250 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
2c260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c270 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75      res = fts5Bu
2c280 66 66 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66  fferCompare(&buf
2c290 31 2c 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20  1, &buf2);.     
2c2a0 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20     if( res<=0 ) 
2c2b0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2c2c0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
2c2d0 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
2c2e0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62  erSet(&p->rc, &b
2c2f0 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66  uf2, buf1.n, buf
2c300 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  1.p);.  }..  fts
2c310 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
2c320 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  1);.  fts5Buffer
2c330 46 72 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a  Free(&buf2);.}..
2c340 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2c350 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2c360 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eckSegment(.  Ft
2c370 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c390 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
2c3a0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
2c3b0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2c3c0 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
2c3d0 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e  ment to check in
2c3e0 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e  ternal consisten
2c3f0 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43  cy */.){.  Fts5C
2c400 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
2c410 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73   p->pConfig;.  s
2c420 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2c430 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
2c440 32 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65  2;.  int iIdxPre
2c450 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
2c460 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74  noFirst-1;.  int
2c470 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
2c480 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
2c490 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  ;..  if( pSeg->p
2c4a0 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65  gnoFirst==0 ) re
2c4b0 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64  turn;..  fts5Ind
2c4c0 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
2c4d0 20 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33   &pStmt, sqlite3
2c4e0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
2c4f0 22 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74  "SELECT segid, t
2c500 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20  erm, (pgno>>1), 
2c510 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51  (pgno&1) FROM %Q
2c520 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
2c530 73 65 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  segid=%d",.     
2c540 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
2c550 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70  Config->zName, p
2c560 53 65 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29  Seg->iSegid.  ))
2c570 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20  ;..  /* Iterate 
2c580 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72  through the b-tr
2c590 65 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a  ee hierarchy.  *
2c5a0 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  /.  while( p->rc
2c5b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
2c5c0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2c5d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
2c5e0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20  {.    i64 iRow; 
2c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c600 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
2c610 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20   this leaf */.  
2c620 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
2c630 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2c640 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73  /* Data for this
2c650 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e   leaf */..    in
2c660 74 20 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c  t nIdxTerm = sql
2c670 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2c680 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  s(pStmt, 1);.   
2c690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2c6a0 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63  xTerm = (const c
2c6b0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2c6c0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
2c6d0 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78  1);.    int iIdx
2c6e0 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63  Leaf = sqlite3_c
2c6f0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2c700 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64   2);.    int bId
2c710 78 44 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33  xDlidx = sqlite3
2c720 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2c730 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  t, 3);..    /* I
2c740 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75  f the leaf in qu
2c750 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  estion has alrea
2c760 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20  dy been trimmed 
2c770 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74  from the segment
2c780 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65  , .    ** ignore
2c790 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74   this b-tree ent
2c7a0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  ry. Otherwise, l
2c7b0 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  oad it into memo
2c7c0 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ry. */.    if( i
2c7d0 49 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67  IdxLeaf<pSeg->pg
2c7e0 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e  noFirst ) contin
2c7f0 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46  ue;.    iRow = F
2c800 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2c810 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
2c820 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70  iIdxLeaf);.    p
2c830 4c 65 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52  Leaf = fts5LeafR
2c840 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20  ead(p, iRow);.  
2c850 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
2c860 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
2c870 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
2c880 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  eaf contains at 
2c890 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
2c8a0 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65  and that it is e
2c8b0 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f  qual.    ** to o
2c8c0 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  r larger than th
2c8d0 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a  e split-key in z
2c8e0 49 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63  IdxTerm.  Also c
2c8f0 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
2c900 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73  re.    ** is als
2c910 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65  o a rowid pointe
2c920 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61  r within the lea
2c930 66 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 69  f page header, i
2c940 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20  t points to a.  
2c950 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65    ** location be
2c960 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20  fore the term.  
2c970 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  */.    if( pLeaf
2c980 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c  ->nn<=pLeaf->szL
2c990 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  eaf ){.      p->
2c9a0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c9b0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
2c9c0 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20      int iOff;   
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9e0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
2c9f0 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20  st term on leaf 
2ca00 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f  */.      int iRo
2ca10 77 69 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20  widOff;         
2ca20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
2ca30 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
2ca40 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69   leaf */.      i
2ca50 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
2ca60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2ca70 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65  ze of term on le
2ca80 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  af in bytes */. 
2ca90 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20       int res;   
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cab0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
2cac0 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74  f term and split
2cad0 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69  -key */..      i
2cae0 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
2caf0 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66  rstTermOff(pLeaf
2cb00 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  );.      iRowidO
2cb10 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
2cb20 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2cb30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  );.      if( iRo
2cb40 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a  widOff>=iOff ){.
2cb50 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2cb60 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2cb70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cb80 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2cb90 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2cba0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
2cbb0 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
2cbc0 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
2cbd0 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65  >p[iOff], zIdxTe
2cbe0 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e  rm, MIN(nTerm, n
2cbf0 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  IdxTerm));.     
2cc00 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
2cc10 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49  res = nTerm - nI
2cc20 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
2cc30 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72  if( res<0 ) p->r
2cc40 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2cc50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2cc60 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
2cc70 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61  eckPgidx(p, pLea
2cc80 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  f);.    }.    ft
2cc90 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2cca0 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
2ccb0 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
2ccc0 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
2ccd0 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
2cce0 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
2ccf0 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
2cd00 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29   leaf.    ** (a)
2cd10 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
2cd20 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
2cd30 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65   */.    fts5Inde
2cd40 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
2cd50 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c  mpty(.        p,
2cd60 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c   pSeg, iIdxPrevL
2cd70 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65  eaf+1, iDlidxPre
2cd80 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61  vLeaf+1, iIdxLea
2cd90 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  f-1.    );.    i
2cda0 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b  f( p->rc ) break
2cdb0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2cdc0 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
2cdd0 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61  index, check tha
2cde0 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74  t it looks right
2cdf0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64  . */.    if( bId
2ce00 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  xDlidx ){.      
2ce10 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
2ce20 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
2ce30 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
2ce40 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
2ce50 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2ce60 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78  iPrevLeaf = iIdx
2ce70 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
2ce80 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
2ce90 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
2cea0 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20   iPg = 0;.      
2ceb0 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20  i64 iKey;..     
2cec0 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2ced0 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2cee0 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78   0, iSegid, iIdx
2cef0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
2cf00 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
2cf10 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
2cf20 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2cf30 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20  lidxIterNext(p, 
2cf40 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b  pDlidx).      ){
2cf50 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
2cf60 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73  ck any rowid-les
2cf70 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63 63  s pages that occ
2cf80 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ur before the cu
2cf90 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
2cfa0 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69         for(iPg=i
2cfb0 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c  PrevLeaf+1; iPg<
2cfc0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2cfd0 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b  o(pDlidx); iPg++
2cfe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65  ){.          iKe
2cff0 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
2d000 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
2d010 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
2d020 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2d030 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
2d040 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
2d050 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2d060 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69 72   if( fts5LeafFir
2d070 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2d080 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  )!=0 ) p->rc = F
2d090 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2d0a0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2d0b0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2d0c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d0e0 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44  PrevLeaf = fts5D
2d0f0 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2d100 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2d110 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2d120 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63   leaf page indic
2d130 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
2d140 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  ator really does
2d150 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
2d160 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75  ain the rowid su
2d170 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73  ggested by the s
2d180 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ame. */.        
2d190 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d  iKey = FTS5_SEGM
2d1a0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
2d1b0 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20  , iPrevLeaf);.  
2d1c0 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
2d1d0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
2d1e0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2d1f0 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
2d200 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
2d210 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
2d220 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
2d230 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2d240 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2d250 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
2d260 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  OK(pLeaf);.     
2d270 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
2d280 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
2d290 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2d2a0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2d2b0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2d2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d2d0 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
2d2e0 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77  t(&pLeaf->p[iRow
2d2f0 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  idOff], (u64*)&i
2d300 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2d310 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d      if( iRowid!=
2d320 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2d330 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e  id(pDlidx) ) p->
2d340 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2d350 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2d360 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2d370 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2d380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d390 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78   }..      iDlidx
2d3a0 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a  PrevLeaf = iPg;.
2d3b0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2d3c0 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
2d3d0 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44  .      fts5TestD
2d3e0 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69  lidxReverse(p, i
2d3f0 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2d400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d410 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61     iDlidxPrevLea
2d420 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  f = pSeg->pgnoLa
2d430 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44  st;.      /* TOD
2d440 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69  O: Check there i
2d450 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64  s no doclist ind
2d460 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ex */.    }..   
2d470 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
2d480 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20  iIdxLeaf;.  }.. 
2d490 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
2d4a0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2d4b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2d4c0 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
2d4d0 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65   rc2;..  /* Page
2d4e0 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74   iter.iLeaf must
2d4f0 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68   now be the righ
2d500 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20  tmost leaf-page 
2d510 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a  in the segment *
2d520 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d  /.#if 0.  if( p-
2d530 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2d540 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53  & iter.iLeaf!=pS
2d550 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
2d560 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2d570 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65  _CORRUPT;.  }.#e
2d580 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ndif.}.../*.** R
2d590 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  un internal chec
2d5a0 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ks to ensure tha
2d5b0 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  t the FTS index 
2d5c0 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  (a) is internall
2d5d0 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74  y .** consistent
2d5e0 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2d5f0 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68  s entries for wh
2d600 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74  ich the XOR of t
2d610 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  he checksums.** 
2d620 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  as calculated by
2d630 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2d640 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73  xEntryCksum() is
2d650 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65   cksum..**.** Re
2d660 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d670 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68  UPT if any of th
2d680 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  e internal check
2d690 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68  s fail, or if th
2d6a0 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f  e.** checksum do
2d6b0 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65  es not match. Re
2d6c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2d6d0 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73  f all checks pas
2d6e0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72  s without.** err
2d6f0 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  or, or some othe
2d700 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  r SQLite error c
2d710 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65  ode if another e
2d720 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a  rror (e.g. OOM).
2d730 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
2d740 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2d750 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2d760 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75  (Fts5Index *p, u
2d770 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  64 cksum){.  int
2d780 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
2d790 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
2d7a0 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30    u64 cksum2 = 0
2d7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d7c0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2d7d0 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
2d7e0 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
2d7f0 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
2d800 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  st = {0,0,0};   
2d810 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
2d820 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74  o hold a poslist
2d830 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
2d840 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
2d850 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
2d860 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2d870 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f   entire index */
2d880 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2d890 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20   *pStruct;      
2d8a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
2d8b0 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66  cture */..#ifdef
2d8c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2d8d0 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61  /* Used by extra
2d8e0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20   internal tests 
2d8f0 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42  only run if NDEB
2d900 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
2d910 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d  d */.  u64 cksum
2d920 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  3 = 0;          
2d930 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
2d940 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
2d950 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
2d960 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2d970 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  term = {0,0,0}; 
2d980 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
2d990 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74  sed to hold most
2d9a0 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a   recent term */.
2d9b0 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 69  #endif.  const i
2d9c0 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49  nt flags = FTS5I
2d9d0 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
2d9e0 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61  PUT;.  .  /* Loa
2d9f0 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  d the FTS index 
2da00 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
2da10 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2da20 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
2da30 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2da40 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2da50 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
2da60 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
2da70 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  ves */.  if( pSt
2da80 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
2da90 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
2daa0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
2dab0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
2dac0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
2dad0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2dae0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
2daf0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
2db00 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46  eg++){.        F
2db10 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2db20 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74  ent *pSeg = &pSt
2db30 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
2db40 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
2db50 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78         fts5Index
2db60 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2db70 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a  gment(p, pSeg);.
2db80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2db90 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75  }..  /* The cksu
2dba0 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  m argument passe
2dbb0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2dbc0 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d  on is a checksum
2dbd0 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a   calculated.  **
2dbe0 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78   based on all ex
2dbf0 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69  pected entries i
2dc00 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
2dc10 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69  (including prefi
2dc20 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74  x index.  ** ent
2dc30 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63  ries). This bloc
2dc40 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20  k checks that a 
2dc50 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
2dc60 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
2dc70 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e  .  ** actual con
2dc80 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64  tents of FTS ind
2dc90 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e  ex is identical.
2dca0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76  .  **.  ** Two v
2dcb0 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  ersions of the s
2dcc0 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65  ame checksum are
2dcd0 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65   calculated. The
2dce0 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20   first (stack.  
2dcf0 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75  ** variable cksu
2dd00 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74  m2) based on ent
2dd10 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66  ries extracted f
2dd20 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  rom the full-tex
2dd30 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69  t index.  ** whi
2dd40 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61  le doing a linea
2dd50 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69  r scan of each i
2dd60 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20  ndividual index 
2dd70 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20  in turn. .  **. 
2dd80 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d   ** As each term
2dd90 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
2dda0 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20  linear scans, a 
2ddb0 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66  separate query f
2ddc0 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  or the.  ** same
2ddd0 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d   term is perform
2dde0 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61  ed. cksum3 is ca
2ddf0 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
2de00 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20  n the entries.  
2de10 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ** extracted by 
2de20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20  these queries.. 
2de30 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   */.  for(fts5Mu
2de40 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
2de50 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c  truct, flags, 0,
2de60 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
2de70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
2de80 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
2de90 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
2dea0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
2deb0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
2dec0 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
2ded0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
2dee0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2def0 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
2df00 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
2df10 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2df20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2df30 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
2df40 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
2df50 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
2df60 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2df70 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
2df80 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
2df90 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
2dfa0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
2dfb0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
2dfc0 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
2dfd0 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
2dfe0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2dff0 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
2e000 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
2e010 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
2e020 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
2e030 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72  .    fts5TestTer
2e040 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e  m(p, &term, z, n
2e050 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
2e060 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  3);..    if( eDe
2e070 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
2e080 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
2e090 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69  if( 0==fts5Multi
2e0a0 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
2e0b0 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Iter) ){.       
2e0c0 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74   cksum2 ^= sqlit
2e0d0 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2e0e0 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c  Cksum(iRowid, 0,
2e0f0 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20   0, -1, z, n);. 
2e100 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e110 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74 2e  {.      poslist.
2e120 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73  n = 0;.      fts
2e130 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
2e140 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
2e150 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
2e160 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f  .iFirst], 0, &po
2e170 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  slist);.      wh
2e180 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46  ile( 0==sqlite3F
2e190 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
2e1a0 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c  (poslist.p, posl
2e1b0 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69  ist.n, &iOff, &i
2e1c0 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos) ){.        
2e1d0 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
2e1e0 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29  POS2COLUMN(iPos)
2e1f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  ;.        int iT
2e200 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53  okOff = FTS5_POS
2e210 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20  2OFFSET(iPos);. 
2e220 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d         cksum2 ^=
2e230 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2e240 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
2e250 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66  id, iCol, iTokOf
2e260 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  f, -1, z, n);.  
2e270 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2e280 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
2e290 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63  , &term, 0, 0, c
2e2a0 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
2e2b0 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
2e2c0 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
2e2d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2e2e0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
2e2f0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2e300 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
2e310 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2e320 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2e330 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e340 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72  BUG.  fts5Buffer
2e350 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e  Free(&term);.#en
2e360 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72  dif.  fts5Buffer
2e370 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a  Free(&poslist);.
2e380 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2e390 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2e3a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2e3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2e3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e430 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
2e440 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
2e450 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e460 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2e470 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66  de() scalar.** f
2e480 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f  unction only..*/
2e490 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
2e4a0 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f   segment-data ro
2e4b0 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  wid from the %_d
2e4c0 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ata table. This 
2e4d0 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74  function is.** t
2e4e0 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d  he opposite of m
2e4f0 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e  acro FTS5_SEGMEN
2e500 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74  T_ROWID()..*/.st
2e510 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2e520 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34  codeRowid(.  i64
2e530 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
2e540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e550 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74  Rowid from %_dat
2e560 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2e570 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20   *piSegid,      
2e580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e590 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20  OUT: Segment id 
2e5a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64  */.  int *pbDlid
2e5b0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2e5c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69       /* OUT: Dli
2e5d0 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74  dx flag */.  int
2e5e0 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20   *piHeight,     
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e600 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20  OUT: Height */. 
2e610 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20   int *piPgno    
2e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e630 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
2e640 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69  mber */.){.  *pi
2e650 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f  Pgno = (int)(iRo
2e660 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
2e670 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
2e680 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
2e690 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
2e6a0 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69  A_PAGE_B;..  *pi
2e6b0 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69  Height = (int)(i
2e6c0 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e6d0 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
2e6e0 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20  IGHT_B) - 1));. 
2e6f0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2e700 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a  _DATA_HEIGHT_B;.
2e710 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69  .  *pbDlidx = (i
2e720 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30  nt)(iRowid & 0x0
2e730 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e  001);.  iRowid >
2e740 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49  >= FTS5_DATA_DLI
2e750 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20  _B;..  *piSegid 
2e760 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2e770 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2e780 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31  5_DATA_ID_B) - 1
2e790 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ));.}..static vo
2e7a0 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  id fts5DebugRowi
2e7b0 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  d(int *pRc, Fts5
2e7c0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36  Buffer *pBuf, i6
2e7d0 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69  4 iKey){.  int i
2e7e0 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
2e7f0 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20  iPgno, bDlidx;  
2e800 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f       /* Rowid co
2e810 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74  mpenents */.  ft
2e820 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b  s5DecodeRowid(iK
2e830 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  ey, &iSegid, &bD
2e840 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
2e850 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  &iPgno);..  if( 
2e860 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
2e870 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f   if( iKey==FTS5_
2e880 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
2e890 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
2e8a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2e8b0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2e8c0 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b   "{averages} ");
2e8d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e8e0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2e8f0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2e900 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72  pRc, pBuf, "{str
2e910 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d  ucture}");.    }
2e920 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20  .  }.  else{.   
2e930 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2e940 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2e950 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65  Rc, pBuf, "{%sse
2e960 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f  gid=%d h=%d pgno
2e970 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62  =%d}",.        b
2e980 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22  Dlidx ? "dlidx "
2e990 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69   : "", iSegid, i
2e9a0 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
2e9b0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
2e9c0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
2e9d0 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
2e9e0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea00 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2ea10 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2ea20 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
2ea30 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
2ea40 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
2ea50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2ea60 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
2ea70 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
2ea80 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
2ea90 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
2eaa0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2eab0 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
2eac0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
2ead0 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
2eae0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
2eaf0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2eb00 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2eb10 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
2eb20 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65  %d nMerge=%d nSe
2eb30 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  g=%d", iLvl, pLv
2eb40 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d  l->nMerge, pLvl-
2eb50 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20  >nSeg.    );.   
2eb60 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2eb70 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
2eb80 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
2eb90 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
2eba0 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
2ebb0 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
2ebc0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ebd0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ebe0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69  (pRc, pBuf, " {i
2ebf0 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  d=%d leaves=%d..
2ec00 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d}", .         
2ec10 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70   pSeg->iSegid, p
2ec20 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
2ec30 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
2ec40 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
2ec50 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2ec60 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2ec70 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
2ec80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2ec90 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2eca0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2ecb0 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2ecc0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2ecd0 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2ece0 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
2ecf0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
2ed00 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
2ed10 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
2ed20 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2ed30 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2ed40 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
2ed50 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
2ed60 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
2ed70 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2ed80 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2ed90 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
2eda0 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2edb0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2edc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2edd0 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2ede0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2edf0 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2ee00 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2ee10 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ee40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
2ee50 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
2ee60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
2ee70 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
2ee80 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
2ee90 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
2eea0 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
2eeb0 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
2eec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2eed0 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
2eee0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2eef0 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
2ef00 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
2ef10 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
2ef20 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2ef30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2ef40 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2ef50 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2ef60 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
2ef70 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
2ef80 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
2ef90 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72   an "averages" r
2efa0 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63  ecord. This func
2efb0 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73  tion .** appends
2efc0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2efd0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2efe0 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68   of record to th
2eff0 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
2f000 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
2f010 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a  d argument. .*/.
2f020 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2f030 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a  DecodeAverages(.
2f040 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f060 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2f070 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2f080 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2f090 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2f0a0 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2f0b0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f   int i = 0;.  co
2f0c0 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65  nst char *zSpace
2f0d0 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28   = "";..  while(
2f0e0 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20   i<nBlob ){.    
2f0f0 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  u64 iVal;.    i 
2f100 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2f110 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69  tVarint(&pBlob[i
2f120 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73  ], &iVal);.    s
2f130 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f140 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f150 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20  , pBuf, "%s%d", 
2f160 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61  zSpace, (int)iVa
2f170 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d  l);.    zSpace =
2f180 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   " ";.  }.}../*.
2f190 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
2f1a0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
2f1b0 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
2f1c0 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
2f1d0 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
2f1e0 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
2f1f0 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
2f200 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
2f210 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
2f220 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
2f230 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
2f240 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
2f250 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
2f260 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
2f270 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2f280 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2f290 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2f2a0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2f2b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f2c0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2f2d0 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2f2e0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2f2f0 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2f300 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
2f310 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
2f320 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
2f330 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
2f340 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2f350 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  &a[iOff], iVal);
2f360 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f370 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f380 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2f390 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a  %d", iVal);.  }.
2f3a0 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
2f3b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72  ../*.** The star
2f3c0 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e  t of buffer (a/n
2f3d0 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  ) contains the s
2f3e0 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  tart of a doclis
2f3f0 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a  t. The doclist.*
2f400 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  * may or may not
2f410 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74   finish within t
2f420 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  he buffer. This 
2f430 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2f440 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65   a text.** repre
2f450 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2f460 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63   part of the doc
2f470 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65  list that is pre
2f480 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a  sent to buffer.*
2f490 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54  * pBuf. .**.** T
2f4a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2f4b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2f4c0 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2f4d0 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2f4e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f4f0 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2f500 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2f510 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2f520 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2f530 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64  n){.  i64 iDocid
2f540 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
2f550 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30   = 0;..  if( n>0
2f560 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73   ){.    iOff = s
2f570 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2f580 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44  int(a, (u64*)&iD
2f590 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ocid);.    sqlit
2f5a0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f5b0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f5c0 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2f5d0 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77  iDocid);.  }.  w
2f5e0 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
2f5f0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
2f600 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20    int bDel;.    
2f610 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
2f620 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f  oslistSize(&a[iO
2f630 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65  ff], &nPos, &bDe
2f640 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2f650 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2f660 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2f670 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e   " nPos=%d%s", n
2f680 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22  Pos, bDel?"*":""
2f690 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
2f6a0 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2f6b0 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69  (pRc, pBuf, &a[i
2f6c0 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66  Off], MIN(n-iOff
2f6d0 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66  , nPos));.    if
2f6e0 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2f6f0 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
2f700 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
2f710 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2f720 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
2f730 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
2f740 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
2f750 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
2f760 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f770 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f780 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44  , " id=%lld", iD
2f790 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ocid);.    }.  }
2f7a0 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  ..  return iOff;
2f7b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2f7c0 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
2f7d0 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2f7e0 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 66  de() debugging f
2f7f0 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a  unction. It is .
2f800 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  ** only ever use
2f810 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f  d with detail=no
2f820 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ne tables..**.**
2f830 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f 6e   Buffer (pData/n
2f840 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20 61  Data) contains a
2f850 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20   doclist in the 
2f860 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20 64  format used by d
2f870 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61  etail=none.** ta
2f880 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74  bles. This funct
2f890 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
2f8a0 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72  man-readable ver
2f8b0 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69 73  sion of that lis
2f8c0 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  t to.** buffer p
2f8d0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  Buf..**.** If *p
2f8e0 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
2f8f0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2f900 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f910 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2f920 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e  .** no-op. If an
2f930 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65 72   OOM or other er
2f940 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
2f950 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
2f960 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74 20   *pRc is.** set 
2f970 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
2f980 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72  or code before r
2f990 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66 69  eturning. The fi
2f9a0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75 66  nal state of buf
2f9b0 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20 75  fer.** pBuf is u
2f9c0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2f9d0 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2f9e0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2f9f0 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e 74  RowidList(.  int
2fa00 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
2fa30 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2fa40 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
2fa50 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
2fa60 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74  r to append text
2fa70 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   to */.  const u
2fa80 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
2fa90 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ata      /* Data
2faa0 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74 2d   to decode list-
2fab0 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a  of-rowids from *
2fac0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  /.){.  int i = 0
2fad0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d  ;.  i64 iRowid =
2fae0 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c   0;..  while( i<
2faf0 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e  nData ){.    con
2fb00 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d 20  st char *zApp = 
2fb10 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61 6c  "";.    u64 iVal
2fb20 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
2fb30 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2fb40 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c  &pData[i], &iVal
2fb50 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b 3d  );.    iRowid +=
2fb60 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20   iVal;..    if( 
2fb70 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61  i<nData && pData
2fb80 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20  [i]==0x00 ){.   
2fb90 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
2fba0 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2fbb0 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2fbc0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2fbd0 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a      zApp = "+";.
2fbe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fbf0 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b       zApp = "*";
2fc00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2fc10 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2fc20 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2fc30 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2fc40 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c 20  lld%s", iRowid, 
2fc50 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zApp);.  }.}../*
2fc60 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
2fc70 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
2fc80 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2fc90 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
2fca0 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
2fcb0 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
2fcc0 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2fcd0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2fce0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2fcf0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2fd00 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2fd10 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2fd20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fd30 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2fd40 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2fd50 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2fd60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2fd70 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2fd80 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
2fd90 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2fda0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2fdb0 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
2fdc0 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
2fdd0 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67  int iSegid,iHeig
2fde0 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b  ht,iPgno,bDlidx;
2fdf0 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
2fe00 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
2fe10 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b  8 *aBlob; int n;
2fe20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
2fe30 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
2fe40 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46    u8 *a = 0;.  F
2fe50 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe70 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
2fe80 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
2fe90 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2fea0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2feb0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2fec0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
2fed0 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44  ce = 0;.  int eD
2fee0 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c  etailNone = (sql
2fef0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
2ff00 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73  Ctx)!=0);..  ass
2ff10 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a  ert( nArg==2 );.
2ff20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e    UNUSED_PARAM(n
2ff30 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Arg);.  memset(&
2ff40 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
2ff50 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f  5Buffer));.  iRo
2ff60 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
2ff70 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
2ff80 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0]);..  /* Make 
2ff90 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
2ffa0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61  cond argument (a
2ffb0 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b   blob) in aBlob[
2ffc0 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20  ]. The aBlob[]. 
2ffd0 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c   ** copy is foll
2ffe0 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54  owed by FTS5_DAT
2fff0 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30  A_ZERO_PADDING 0
30000 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68  x00 bytes, which
30010 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62   prevents.  ** b
30020 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20  uffer overreads 
30030 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f  even if the reco
30040 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  rd is corrupt.  
30050 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  */.  n = sqlite3
30060 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
30070 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20  al[1]);.  aBlob 
30080 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
30090 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  blob(apVal[1]);.
300a0 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46    nSpace = n + F
300b0 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
300c0 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38  DDING;.  a = (u8
300d0 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
300e0 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70  locZero(&rc, nSp
300f0 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30  ace);.  if( a==0
30100 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f   ) goto decode_o
30110 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20  ut;.  memcpy(a, 
30120 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66  aBlob, n);...  f
30130 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
30140 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c 20  Rowid, &iSegid, 
30150 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
30160 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66  t, &iPgno);..  f
30170 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72  ts5DebugRowid(&r
30180 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a  c, &s, iRowid);.
30190 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a    if( bDlidx ){.
301a0 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69      Fts5Data dli
301b0 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  dx;.    Fts5Dlid
301c0 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64  xLvl lvl;..    d
301d0 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20  lidx.p = a;.    
301e0 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20  dlidx.nn = n;.. 
301f0 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20     memset(&lvl, 
30200 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
30210 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76  idxLvl));.    lv
30220 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64 78  l.pData = &dlidx
30230 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50  ;.    lvl.iLeafP
30240 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20  gno = iPgno;..  
30250 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 4c    for(fts5DlidxL
30260 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76  vlNext(&lvl); lv
30270 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44  l.bEof==0; fts5D
30280 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c  lidxLvlNext(&lvl
30290 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )){.      sqlite
302a0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
302b0 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
302c0 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64   .          " %d
302d0 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65  (%lld)", lvl.iLe
302e0 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77  afPgno, lvl.iRow
302f0 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
30300 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53  }.  }else if( iS
30310 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egid==0 ){.    i
30320 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f  f( iRowid==FTS5_
30330 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
30340 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  {.      fts5Deco
30350 64 65 41 76 65 72 61 67 65 73 28 26 72 63 2c 20  deAverages(&rc, 
30360 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
30370 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
30380 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
30390 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
303a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
303b0 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 29 7b  ( eDetailNone ){
303c0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
303d0 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
303e0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65     /* Current te
303f0 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67  rm read from pag
30400 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  e */.    int szL
30410 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  eaf;.    int iPg
30420 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20  idxOff = szLeaf 
30430 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
30440 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 54 65  2]);.    int iTe
30450 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e  rmOff;.    int n
30460 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Keep = 0;.    in
30470 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d 65 6d  t iOff;..    mem
30480 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
30490 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
304a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64  );..    /* Decod
304b0 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
304c0 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
304d0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2e 20  the first term. 
304e0 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c 65 61  */.    if( szLea
304f0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 50 67  f<n ){.      iPg
30500 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  idxOff += fts5Ge
30510 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
30520 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66  idxOff], iTermOf
30530 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
30540 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
30550 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
30560 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
30570 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  dList(&rc, &s, &
30580 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 34  a[4], iTermOff-4
30590 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  );..    iOff = i
305a0 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77 68 69  TermOff;.    whi
305b0 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  le( iOff<szLeaf 
305c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 70  ){.      int nAp
305d0 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pend;..      /* 
305e0 52 65 61 64 20 74 68 65 20 74 65 72 6d 20 64 61  Read the term da
305f0 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ta for the next 
30600 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69 4f 66  term*/.      iOf
30610 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
30620 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
30630 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20 20 74  Append);.      t
30640 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20  erm.n = nKeep;. 
30650 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
30660 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
30670 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c 20 26  term, nAppend, &
30680 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  a[iOff]);.      
30690 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
306a0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
306b0 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
306c0 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
306d0 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
306e0 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
306f0 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20    );.      iOff 
30700 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20  += nAppend;..   
30710 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
30720 20 77 68 65 72 65 20 74 68 65 20 64 6f 63 6c 69   where the docli
30730 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  st for this term
30740 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69   ends */.      i
30750 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
30760 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49  {.        int nI
30770 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69 50 67  ncr;.        iPg
30780 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  idxOff += fts5Ge
30790 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
307a0 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72 29 3b  idxOff], nIncr);
307b0 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66  .        iTermOf
307c0 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20  f += nIncr;.    
307d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
307e0 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65   iTermOff = szLe
307f0 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  af;.      }..   
30800 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77     fts5DecodeRow
30810 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  idList(&rc, &s, 
30820 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72 6d 4f  &a[iOff], iTermO
30830 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  ff-iOff);.      
30840 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
30850 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
30860 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
30870 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
30880 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
30890 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
308a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
308b0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
308c0 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
308d0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65     Fts5Buffer te
308e0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
308f0 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d   /* Current term
30900 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20   read from page 
30910 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61  */.    int szLea
30920 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
30930 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
30940 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a  f pgidx in a[] *
30950 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78  /.    int iPgidx
30960 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  Off;.    int iPg
30970 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20 20  idxPrev = 0;    
30980 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
30990 75 73 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  us value read fr
309a0 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20 20  om pgidx */.    
309b0 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
309c0 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64  ;.    int iRowid
309d0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
309e0 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e   iOff;.    int n
309f0 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65  Doclist;..    me
30a00 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
30a10 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
30a20 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34  ));..    if( n<4
30a30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30a40 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
30a50 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73  rc, &s, 7, (cons
30a60 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29  t u8*)"corrupt")
30a70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63  ;.      goto dec
30a80 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c  ode_out;.    }el
30a90 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  se{.      iRowid
30aa0 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
30ab0 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[0]);.      i
30ac0 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61  PgidxOff = szLea
30ad0 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
30ae0 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[2]);.      if(
30af0 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
30b00 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
30b10 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
30b20 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29  xOff], iTermOff)
30b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30b40 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
30b50 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
30b60 20 74 61 69 6c 20 61 74 20 74 68 65 20 73 74 61   tail at the sta
30b70 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
30b80 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
30b90 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off!=0 ){.      
30ba0 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66  iOff = iRowidOff
30bb0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30bc0 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20  iTermOff!=0 ){. 
30bd0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
30be0 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mOff;.    }else{
30bf0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73 7a  .      iOff = sz
30c00 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Leaf;.    }.    
30c10 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
30c20 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d  t(&rc, &s, &a[4]
30c30 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20  , iOff-4);..    
30c40 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f  /* Decode any mo
30c50 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61 20  re doclist data 
30c60 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
30c70 74 68 65 20 70 61 67 65 20 62 65 66 6f 72 65 20  the page before 
30c80 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
30c90 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44   term. */.    nD
30ca0 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d 4f  oclist = (iTermO
30cb0 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20  ff ? iTermOff : 
30cc0 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a  szLeaf) - iOff;.
30cd0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 44 6f      fts5DecodeDo
30ce0 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
30cf0 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73  a[iOff], nDoclis
30d00 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
30d10 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20  iPgidxOff<n ){. 
30d20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 20       int bFirst 
30d30 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73 7a  = (iPgidxOff==sz
30d40 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54 72  Leaf);     /* Tr
30d50 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72  ue for first ter
30d60 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  m on page */.   
30d70 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
30d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d90 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
30da0 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20  s of data */.   
30db0 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20     int iEnd;.   
30dc0 20 20 20 0a 20 20 20 20 20 20 69 50 67 69 64 78     .      iPgidx
30dd0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
30de0 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
30df0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
30e00 20 20 20 20 69 50 67 69 64 78 50 72 65 76 20 2b      iPgidxPrev +
30e10 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  = nByte;.      i
30e20 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72 65 76  Off = iPgidxPrev
30e30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50 67  ;..      if( iPg
30e40 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  idxOff<n ){.    
30e50 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
30e60 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
30e70 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
30e80 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64 78     iEnd = iPgidx
30e90 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20 20  Prev + nByte;.  
30ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30eb0 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61 66     iEnd = szLeaf
30ec0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30ed0 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29   if( bFirst==0 )
30ee0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
30ef0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30f00 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
30f10 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d  e);.        term
30f20 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  .n = nByte;.    
30f30 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20 2b    }.      iOff +
30f40 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30f50 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
30f60 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
30f70 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
30f80 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65  rc, &term, nByte
30f90 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  , &a[iOff]);.   
30fa0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65     iOff += nByte
30fb0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
30fc0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
30fd0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
30fe0 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72    &rc, &s, " ter
30ff0 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c  m=%.*s", term.n,
31000 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65   (const char*)te
31010 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20  rm.p.      );.  
31020 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
31030 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
31040 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
31050 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20   iEnd-iOff);.   
31060 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
31070 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
31080 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75   }.  . decode_ou
31090 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
310a0 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e(a);.  if( rc==
310b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
310c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
310d0 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73  text(pCtx, (cons
310e0 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e  t char*)s.p, s.n
310f0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
31100 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
31110 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
31120 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78  _error_code(pCtx
31130 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73  , rc);.  }.  fts
31140 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b  5BufferFree(&s);
31150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  .}../*.** The im
31160 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
31170 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61  user-defined sca
31180 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  lar function fts
31190 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74  5_rowid()..*/.st
311a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f  atic void fts5Ro
311b0 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  widFunction(.  s
311c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
311d0 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
311e0 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
311f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
31200 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
31210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31220 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
31230 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
31240 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
31250 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
31260 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
31270 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ents */.){.  con
31280 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
31290 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a   if( nArg==0 ){.
312a0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
312b0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22  lt_error(pCtx, "
312c0 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
312d0 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e  rowid(subject, .
312e0 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  ...)", -1);.  }e
312f0 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  lse{.    zArg = 
31300 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
31310 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
31320 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69  apVal[0]);.    i
31330 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
31340 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67  ricmp(zArg, "seg
31350 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  ment") ){.      
31360 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
31370 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67 6e    int segid, pgn
31380 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  o;.      if( nAr
31390 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=3 ){.        
313a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
313b0 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
313c0 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20          "should 
313d0 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27  be: fts5_rowid('
313e0 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c  segment', segid,
313f0 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20   pgno))", -1.   
31400 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
31410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 67  lse{.        seg
31420 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
31430 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29  ue_int(apVal[1])
31440 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d  ;.        pgno =
31450 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
31460 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  nt(apVal[2]);.  
31470 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46        iRowid = F
31480 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
31490 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  D(segid, pgno);.
314a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
314b0 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
314c0 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
314d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
314e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
314f0 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
31500 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20  .        "first 
31510 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69  arg to fts5_rowi
31520 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67  d() must be 'seg
31530 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20 20  ment'" , -1.    
31540 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
31550 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
31560 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
31570 66 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68  f registering th
31580 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69  e FTS5 module wi
31590 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  th database.** c
315a0 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74  onnection db. It
315b0 20 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72   registers sever
315c0 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  al user-defined 
315d0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73  scalar functions
315e0 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20   useful.** with 
315f0 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  FTS5..**.** If s
31600 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
31610 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
31620 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
31630 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72  curs, some other
31640 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  .** SQLite error
31650 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
31660 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e  d instead..*/.in
31670 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
31680 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a  exInit(sqlite3 *
31690 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
316a0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
316b0 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64  unction(.      d
316c0 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22  b, "fts5_decode"
316d0 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
316e0 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46  , 0, fts5DecodeF
316f0 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
31700 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
31710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
31720 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
31730 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
31740 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64       db, "fts5_d
31750 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32 2c 20  ecode_none", 2, 
31760 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
31770 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 64 62 2c  UTF8, (void*)db,
31780 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
31790 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  ion, 0, 0.    );
317a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
317b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
317c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
317d0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
317e0 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
317f0 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c  _rowid", -1, SQL
31800 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
31810 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20  5RowidFunction, 
31820 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
31830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31840 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
31850 49 6e 64 65 78 52 65 73 65 74 28 46 74 73 35 49  IndexReset(Fts5I
31860 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65  ndex *p){.  asse
31870 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d  rt( p->pStruct==
31880 30 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63 74 56  0 || p->iStructV
31890 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 69  ersion!=0 );.  i
318a0 66 28 20 66 74 73 35 49 6e 64 65 78 44 61 74 61  f( fts5IndexData
318b0 56 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d 3e 69  Version(p)!=p->i
318c0 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20 29 7b  StructVersion ){
318d0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
318e0 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b  reInvalidate(p);
318f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74  .  }.  return ft
31900 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
31910 3b 0a 7d 0a                                      ;.}.