/ Hex Artifact Content
Login

Artifact cdceac47287c66500214ee946ca871ac48027a82a0ca82177c1c6af19f181ca0:


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 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
62d0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
62e0: 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a      p->nRead++;.
62f0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28    }..  assert( (
6300: 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63  pRet==0)==(p->rc
6310: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  !=SQLITE_OK) );.
6320: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
6330: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
6340: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64  a reference to d
6350: 61 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72  ata record retur
6360: 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
6370: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73  r call to.** fts
6380: 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a  5DataRead()..*/.
6390: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
63a0: 44 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35  DataRelease(Fts5
63b0: 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20  Data *pData){.  
63c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
63d0: 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46  ta);.}..static F
63e0: 74 73 35 44 61 74 61 20 2a 66 74 73 35 4c 65 61  ts5Data *fts5Lea
63f0: 66 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  fRead(Fts5Index 
6400: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
6410: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65  .  Fts5Data *pRe
6420: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
6430: 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69  (p, iRowid);.  i
6440: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
6450: 66 28 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 3e  f( pRet->szLeaf>
6460: 70 52 65 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20  pRet->nn ){.    
6470: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
6480: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 66 74  ORRUPT;.      ft
6490: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 52  s5DataRelease(pR
64a0: 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20  et);.      pRet 
64b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
64c0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
64d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
64e0: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
64f0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
6500: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ,.  sqlite3_stmt
6510: 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61   **ppStmt,.  cha
6520: 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28  r *zSql.){.  if(
6530: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6540: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71  K ){.    if( zSq
6550: 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  l ){.      p->rc
6560: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
6570: 72 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67  re_v2(p->pConfig
6580: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
6590: 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  ppStmt, 0);.    
65a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
65b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
65c0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  M;.    }.  }.  s
65d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
65e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  );.  return p->r
65f0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53  c;.}.../*.** INS
6600: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61  ERT OR REPLACE a
6610: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
6620: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
6630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6640: 73 35 44 61 74 61 57 72 69 74 65 28 46 74 73 35  s5DataWrite(Fts5
6650: 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52  Index *p, i64 iR
6660: 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  owid, const u8 *
6670: 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
6680: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ){.  if( p->rc!=
6690: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
66a0: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57  rn;..  if( p->pW
66b0: 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  riter==0 ){.    
66c0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
66d0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
66e0: 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50  ;.    fts5IndexP
66f0: 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
6700: 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c 69 74  ->pWriter, sqlit
6710: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6720: 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49        "REPLACE I
6730: 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64 61 74  NTO '%q'.'%q_dat
6740: 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41  a'(id, block) VA
6750: 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20  LUES(?,?)", .   
6760: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
6770: 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
6780: 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  ame.    ));.    
6790: 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
67a0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  rn;.  }..  sqlit
67b0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
67c0: 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f  >pWriter, 1, iRo
67d0: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  wid);.  sqlite3_
67e0: 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72  bind_blob(p->pWr
67f0: 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20  iter, 2, pData, 
6800: 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54  nData, SQLITE_ST
6810: 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
6820: 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72  _step(p->pWriter
6830: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  );.  p->rc = sql
6840: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57  ite3_reset(p->pW
6850: 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  riter);.}../*.**
6860: 20 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c   Execute the fol
6870: 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a  lowing SQL:.**.*
6880: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  *     DELETE FRO
6890: 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69  M %_data WHERE i
68a0: 64 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73  d BETWEEN $iFirs
68b0: 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a  t AND $iLast.*/.
68c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
68d0: 44 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49  DataDelete(Fts5I
68e0: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69  ndex *p, i64 iFi
68f0: 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b  rst, i64 iLast){
6900: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
6910: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6920: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c  ;..  if( p->pDel
6930: 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69  eter==0 ){.    i
6940: 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43  nt rc;.    Fts5C
6950: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6960: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6970: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
6980: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
6990: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
69a0: 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64 61 74  ROM '%q'.'%q_dat
69b0: 61 27 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41  a' WHERE id>=? A
69c0: 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20  ND id<=?", .    
69d0: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
69e0: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
69f0: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
6a00: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
6a10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6a20: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
6a30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6a40: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
6a50: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c  Config->db, zSql
6a60: 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74  , -1, &p->pDelet
6a70: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
6a80: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
6a90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6aa0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6ab0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
6ac0: 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
6ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
6ae0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
6af0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c  (p->pDeleter, 1,
6b00: 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69   iFirst);.  sqli
6b10: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6b20: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69  ->pDeleter, 2, i
6b30: 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Last);.  sqlite3
6b40: 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65  _step(p->pDelete
6b50: 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  r);.  p->rc = sq
6b60: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
6b70: 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Deleter);.}../*.
6b80: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65  ** Remove all re
6b90: 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65 64  cords associated
6ba0: 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53   with segment iS
6bb0: 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  egid..*/.static 
6bc0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d  void fts5DataRem
6bd0: 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49  oveSegment(Fts5I
6be0: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65  ndex *p, int iSe
6bf0: 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72  gid){.  i64 iFir
6c00: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
6c10: 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
6c20: 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20  0);.  i64 iLast 
6c30: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
6c40: 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30  OWID(iSegid+1, 0
6c50: 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44  )-1;.  fts5DataD
6c60: 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c  elete(p, iFirst,
6c70: 20 69 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70   iLast);.  if( p
6c80: 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30  ->pIdxDeleter==0
6c90: 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
6ca0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
6cb0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74  >pConfig;.    ft
6cc0: 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
6cd0: 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65  mt(p, &p->pIdxDe
6ce0: 6c 65 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  leter, sqlite3_m
6cf0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
6d00: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6d10: 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45  %q'.'%q_idx' WHE
6d20: 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20  RE segid=?",.   
6d30: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
6d40: 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
6d50: 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a  ame.    ));.  }.
6d60: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
6d70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
6d80: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
6d90: 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31  ->pIdxDeleter, 1
6da0: 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73  , iSegid);.    s
6db0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
6dc0: 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
6dd0: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6de0: 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65  _reset(p->pIdxDe
6df0: 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  leter);.  }.}../
6e00: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
6e10: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46  eference to an F
6e20: 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
6e30: 65 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ect returned by 
6e40: 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63  an earlier .** c
6e50: 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63  all to fts5Struc
6e60: 74 75 72 65 52 65 61 64 28 29 20 6f 72 20 66 74  tureRead() or ft
6e70: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
6e80: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
6e90: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
6ea0: 65 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 72  eRelease(Fts5Str
6eb0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6ec0: 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  {.  if( pStruct 
6ed0: 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74  && 0>=(--pStruct
6ee0: 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69  ->nRef) ){.    i
6ef0: 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
6f00: 28 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d  ( pStruct->nRef=
6f10: 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
6f20: 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  0; i<pStruct->nL
6f30: 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
6f40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6f50: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
6f60: 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20  ].aSeg);.    }. 
6f70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6f80: 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a  pStruct);.  }.}.
6f90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6fa0: 35 53 74 72 75 63 74 75 72 65 52 65 66 28 46 74  5StructureRef(Ft
6fb0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
6fc0: 72 75 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74  ruct){.  pStruct
6fd0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nRef++;.}../*.
6fe0: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61  ** Deserialize a
6ff0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74  nd return the st
7000: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 63  ructure record c
7010: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
7020: 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a  in serialized.**
7030: 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66   form within buf
7040: 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e  fer pData/nData.
7050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
7060: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
7070: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
7080: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
7090: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
70a0: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
70b0: 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68   by one slot. Th
70c0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74  is allows the st
70d0: 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73  ructure contents
70e0: 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65  .** to be more e
70f0: 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a  asily edited..**
7100: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
7110: 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69  occurs, *ppOut i
7120: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
7130: 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
7140: 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e  r code.** return
7150: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a  ed. Otherwise, *
7160: 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  ppOut is set to 
7170: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
7180: 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53   object and.** S
7190: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
71a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
71b0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
71c0: 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38  code(.  const u8
71d0: 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
71f0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72  r containing ser
7200: 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72  ialized structur
7210: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  e */.  int nData
7220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7230: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
7240: 66 20 62 75 66 66 65 72 20 70 44 61 74 61 20 69  f buffer pData i
7250: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
7260: 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20   *piCookie,     
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7280: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
7290: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
72a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
72b0: 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
72c0: 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c  /* OUT: Deserial
72d0: 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ized object */.)
72e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
72f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20  ITE_OK;.  int i 
7300: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b  = 0;.  int iLvl;
7310: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20  .  int nLevel = 
7320: 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  0;.  int nSegmen
7330: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
7340: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
7350: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7360: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
7370: 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a  locate at pRet *
7380: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
7390: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
73a0: 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
73b0: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
73c0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20  n */..  /* Grab 
73d0: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
73e0: 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b   */.  if( piCook
73f0: 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d  ie ) *piCookie =
7400: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33   sqlite3Fts5Get3
7410: 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20  2(pData);.  i = 
7420: 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  4;..  /* Read th
7430: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
7440: 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67  f levels and seg
7450: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
7460: 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tart of the.  **
7470: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
7480: 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74  d.  */.  i += ft
7490: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
74a0: 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29  Data[i], nLevel)
74b0: 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  ;.  i += fts5Get
74c0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
74d0: 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  i], nSegment);. 
74e0: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
74f0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7500: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7520: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
7530: 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
7540: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7550: 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20  ) * (nLevel-1)  
7560: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
7570: 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52  ray */.  );.  pR
7580: 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  et = (Fts5Struct
7590: 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
75a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
75b0: 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
75c0: 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d  Ret ){.    pRet-
75d0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
75e0: 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c  Ret->nLevel = nL
75f0: 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e  evel;.    pRet->
7600: 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d  nSegment = nSegm
7610: 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71  ent;.    i += sq
7620: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
7630: 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70  nt(&pData[i], &p
7640: 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  Ret->nWriteCount
7650: 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c  er);..    for(iL
7660: 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  vl=0; rc==SQLITE
7670: 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76  _OK && iLvl<nLev
7680: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
7690: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
76a0: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
76b0: 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  Ret->aLevel[iLvl
76c0: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ];.      int nTo
76d0: 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tal = 0;.      i
76e0: 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20  nt iSeg;..      
76f0: 69 66 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a  if( i>=nData ){.
7700: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
7710: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7730: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7740: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7750: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
7760: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7770: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7780: 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a  ta[i], nTotal);.
7790: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
77a0: 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d  nTotal>=pLvl->nM
77b0: 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  erge );.        
77c0: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
77d0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
77e0: 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
77f0: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a  allocZero(&rc, .
7800: 20 20 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74              nTot
7810: 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  al * sizeof(Fts5
7820: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7830: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
7840: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
7850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7860: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
7870: 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20  Seg = nTotal;.  
7880: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
7890: 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69  ; iSeg<nTotal; i
78a0: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
78b0: 20 20 69 66 28 20 69 3e 3d 6e 44 61 74 61 20 29    if( i>=nData )
78c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
78d0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
78e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
78f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
7900: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66            i += f
7910: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
7920: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
7930: 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
7940: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  d);.          i 
7950: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7960: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7970: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
7980: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
7990: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
79a0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
79b0: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
79c0: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
79d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
79e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
79f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7a00: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
7a10: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
7a20: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
7a30: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
7a40: 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a   *ppOut = pRet;.
7a50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7a60: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
7a70: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7a80: 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a  reAddLevel(int *
7a90: 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74 75  pRc, Fts5Structu
7aa0: 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a  re **ppStruct){.
7ab0: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
7ac0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
7ad0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
7ae0: 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
7af0: 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  .    int nLevel 
7b00: 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  = pStruct->nLeve
7b10: 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  l;.    int nByte
7b20: 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a   = (.        siz
7b30: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7b40: 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  e) +            
7b50: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
7b60: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
7b70: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7b80: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20  ructureLevel) * 
7b90: 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61  (nLevel+1)  /* a
7ba0: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
7bb0: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74  .    );..    pSt
7bc0: 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72  ruct = sqlite3_r
7bd0: 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20  ealloc(pStruct, 
7be0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
7bf0: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
7c00: 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74   memset(&pStruct
7c10: 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d  ->aLevel[nLevel]
7c20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
7c30: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29  StructureLevel))
7c40: 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
7c50: 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  >nLevel++;.     
7c60: 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
7c70: 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ruct;.    }else{
7c80: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
7c90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7ca0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
7cb0: 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c  xtend level iLvl
7cc0: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
7cd0: 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65  s room for at le
7ce0: 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a  ast nExtra more.
7cf0: 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** segments..*/.
7d00: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7d10: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
7d20: 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63  evel(.  int *pRc
7d30: 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  , .  Fts5Structu
7d40: 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20  re *pStruct, .  
7d50: 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74  int iLvl, .  int
7d60: 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20   nExtra, .  int 
7d70: 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28  bInsert.){.  if(
7d80: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
7d90: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
7da0: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
7db0: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
7dc0: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46  vel[iLvl];.    F
7dd0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7de0: 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69  ent *aNew;.    i
7df0: 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  nt nByte;..    n
7e00: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
7e10: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
7e20: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7e30: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7e40: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
7e50: 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53  realloc(pLvl->aS
7e60: 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  eg, nByte);.    
7e70: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
7e80: 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30    if( bInsert==0
7e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
7ea0: 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e  et(&aNew[pLvl->n
7eb0: 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Seg], 0, sizeof(
7ec0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7ed0: 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b  ment) * nExtra);
7ee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ef0: 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
7f00: 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73  = pLvl->nSeg * s
7f10: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7f20: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7f30: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e       memmove(&aN
7f40: 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77  ew[nExtra], aNew
7f50: 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  , nMove);.      
7f60: 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30    memset(aNew, 0
7f70: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7f80: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7f90: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7fa0: 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  }.      pLvl->aS
7fb0: 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d  eg = aNew;.    }
7fc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63  else{.      *pRc
7fd0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7fe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
7ff0: 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
8000: 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72  re *fts5Structur
8010: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 46 74  eReadUncached(Ft
8020: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
8030: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
8040: 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 43 6f  et = 0;.  Fts5Co
8050: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
8060: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e  p->pConfig;.  in
8070: 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20  t iCookie;      
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8090: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   Configuration c
80a0: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44  ookie */.  Fts5D
80b0: 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70  ata *pData;..  p
80c0: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
80d0: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55  ead(p, FTS5_STRU
80e0: 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20  CTURE_ROWID);.  
80f0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8100: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
8110: 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20  ODO: Do we need 
8120: 74 68 69 73 20 69 66 20 74 68 65 20 6c 65 61 66  this if the leaf
8130: 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64  -index is append
8140: 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20  ed? Probably... 
8150: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  */.    memset(&p
8160: 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e  Data->p[pData->n
8170: 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41  n], 0, FTS5_DATA
8180: 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 70  _PADDING);.    p
8190: 2d 3e 72 63 20 3d 20 66 74 73 35 53 74 72 75 63  ->rc = fts5Struc
81a0: 74 75 72 65 44 65 63 6f 64 65 28 70 44 61 74 61  tureDecode(pData
81b0: 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20  ->p, pData->nn, 
81c0: 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29  &iCookie, &pRet)
81d0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
81e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43  =SQLITE_OK && pC
81f0: 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d  onfig->iCookie!=
8200: 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 20  iCookie ){.     
8210: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
8220: 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70  Fts5ConfigLoad(p
8230: 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29  Config, iCookie)
8240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
8250: 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
8260: 61 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  a);.    if( p->r
8270: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8280: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
8290: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
82a0: 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30  ;.      pRet = 0
82b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
82c0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73  eturn pRet;.}..s
82d0: 74 61 74 69 63 20 69 36 34 20 66 74 73 35 49 6e  tatic i64 fts5In
82e0: 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28 46  dexDataVersion(F
82f0: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
8300: 69 36 34 20 69 56 65 72 73 69 6f 6e 20 3d 20 30  i64 iVersion = 0
8310: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
8320: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8330: 20 69 66 28 20 70 2d 3e 70 44 61 74 61 56 65 72   if( p->pDataVer
8340: 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sion==0 ){.     
8350: 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 49 6e 64   p->rc = fts5Ind
8360: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
8370: 20 26 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f   &p->pDataVersio
8380: 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  n, .          sq
8390: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
83a0: 52 41 47 4d 41 20 25 51 2e 64 61 74 61 5f 76 65  RAGMA %Q.data_ve
83b0: 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f 6e 66  rsion", p->pConf
83c0: 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20 20 20 20  ig->zDb).       
83d0: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
83e0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30  p->rc ) return 0
83f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
8400: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
8410: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 61  ite3_step(p->pDa
8420: 74 61 56 65 72 73 69 6f 6e 29 20 29 7b 0a 20 20  taVersion) ){.  
8430: 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d 20 73      iVersion = s
8440: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
8450: 74 36 34 28 70 2d 3e 70 44 61 74 61 56 65 72 73  t64(p->pDataVers
8460: 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ion, 0);.    }. 
8470: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
8480: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 61 74  e3_reset(p->pDat
8490: 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 7d 0a 0a  aVersion);.  }..
84a0: 20 20 72 65 74 75 72 6e 20 69 56 65 72 73 69 6f    return iVersio
84b0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  n;.}../*.** Read
84c0: 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  , deserialize an
84d0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
84e0: 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
84f0: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
8500: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
8510: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
8520: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
8530: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
8540: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61  over-allocated a
8550: 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72 20  s described for 
8560: 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72  function fts5Str
8570: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a  uctureDecode() .
8580: 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ** above..**.** 
8590: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
85a0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
85b0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
85c0: 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74  r code left in t
85d0: 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20  he.** Fts5Index 
85e0: 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72  handle. If an er
85f0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
8600: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
8610: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
8620: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
8630: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
8640: 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
8650: 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52   *fts5StructureR
8660: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
8670: 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 74  ){..  if( p->pSt
8680: 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ruct==0 ){.    p
8690: 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
86a0: 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61 74 61   = fts5IndexData
86b0: 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20 20 20  Version(p);.    
86c0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
86d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
86e0: 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  >pStruct = fts5S
86f0: 74 72 75 63 74 75 72 65 52 65 61 64 55 6e 63 61  tructureReadUnca
8700: 63 68 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20  ched(p);.    }. 
8710: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65 6c 73 65   }..#if 0.  else
8720: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
8730: 75 72 65 20 2a 70 54 65 73 74 20 3d 20 66 74 73  ure *pTest = fts
8740: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
8750: 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20 69  cached(p);.    i
8760: 66 28 20 70 54 65 73 74 20 29 7b 0a 20 20 20 20  f( pTest ){.    
8770: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
8780: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e    assert_nc( p->
8790: 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
87a0: 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65 67 6d 65  t==pTest->nSegme
87b0: 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nt );.      asse
87c0: 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63  rt_nc( p->pStruc
87d0: 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65 73 74  t->nLevel==pTest
87e0: 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  ->nLevel );.    
87f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 65    for(i=0; i<pTe
8800: 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  st->nLevel; i++)
8810: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8820: 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d  _nc( p->pStruct-
8830: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67  >aLevel[i].nMerg
8840: 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c  e==pTest->aLevel
8850: 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a 20 20  [i].nMerge );.  
8860: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8870: 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65   p->pStruct->aLe
8880: 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70 54 65  vel[i].nSeg==pTe
8890: 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53  st->aLevel[i].nS
88a0: 65 67 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  eg );.        fo
88b0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73 74 2d 3e  r(j=0; j<pTest->
88c0: 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 20  aLevel[i].nSeg; 
88d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
88e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
88f0: 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70 54 65 73  ment *p1 = &pTes
8900: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
8910: 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g[j];.          
8920: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
8930: 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 2d 3e 70  ment *p2 = &p->p
8940: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8950: 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20  ].aSeg[j];.     
8960: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
8970: 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70 32 2d 3e  p1->iSegid==p2->
8980: 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20  iSegid );.      
8990: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
89a0: 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 70 32  1->pgnoFirst==p2
89b0: 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b 0a 20  ->pgnoFirst );. 
89c0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
89d0: 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61 73 74  nc( p1->pgnoLast
89e0: 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  ==p2->pgnoLast )
89f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8a00: 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 53 74    }.      fts5St
8a10: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8a20: 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Test);.    }.  }
8a30: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
8a40: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
8a50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
8a60: 73 65 72 74 28 20 70 2d 3e 69 53 74 72 75 63 74  sert( p->iStruct
8a70: 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20  Version!=0 );.  
8a80: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75  assert( p->pStru
8a90: 63 74 21 3d 30 20 29 3b 0a 20 20 66 74 73 35 53  ct!=0 );.  fts5S
8aa0: 74 72 75 63 74 75 72 65 52 65 66 28 70 2d 3e 70  tructureRef(p->p
8ab0: 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72  Struct);.  retur
8ac0: 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b 0a 7d 0a  n p->pStruct;.}.
8ad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8ae0: 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
8af0: 64 61 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  date(Fts5Index *
8b00: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 53 74  p){.  if( p->pSt
8b10: 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74 73 35  ruct ){.    fts5
8b20: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
8b30: 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20  (p->pStruct);.  
8b40: 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 30    p->pStruct = 0
8b50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8b60: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
8b70: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
8b80: 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75  ts in index stru
8b90: 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54  cture pStruct. T
8ba0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8bb0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
8bc0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
8bd0: 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73  ert() conditions
8be0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8bf0: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
8c00: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
8c10: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46  eCountSegments(F
8c20: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
8c30: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53  truct){.  int nS
8c40: 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  egment = 0;     
8c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
8c60: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
8c70: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70  ments */.  if( p
8c80: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
8c90: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
8cb0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
8cc0: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
8cd0: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
8ce0: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
8cf0: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
8d00: 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b        nSegment +
8d10: 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
8d20: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20  l[iLvl].nSeg;.  
8d30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
8d40: 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65  n nSegment;.}.#e
8d50: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74  ndif..#define ft
8d60: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
8d70: 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c  ndBlob(pBuf, pBl
8d80: 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20 20 20  ob, nBlob) {    
8d90: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42   \.  assert( (pB
8da0: 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 28 70  uf)->nSpace>=((p
8db0: 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29  Buf)->n+nBlob) )
8dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ;             \.
8dd0: 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75 66 29    memcpy(&(pBuf)
8de0: 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20  ->p[(pBuf)->n], 
8df0: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20  pBlob, nBlob);  
8e00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28             \.  (
8e10: 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f  pBuf)->n += nBlo
8e20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65          \.}..#de
8e50: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 53  fine fts5BufferS
8e60: 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
8e70: 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20 20 20  pBuf, iVal) {   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8e90: 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 73 71   (pBuf)->n += sq
8ea0: 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
8eb0: 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70  nt(&(pBuf)->p[(p
8ec0: 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29  Buf)->n], (iVal)
8ed0: 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20  );  \.  assert( 
8ee0: 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d  (pBuf)->nSpace>=
8ef0: 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20 20 20  (pBuf)->n );    
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
8f20: 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  * Serialize and 
8f30: 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75 63  store the "struc
8f40: 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a  ture" record..**
8f50: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
8f60: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
8f70: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74   error code in t
8f80: 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  he Fts5Index obj
8f90: 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ect. If an.** er
8fa0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
8fb0: 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
8fc0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
8fd0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
8fe0: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
8ff0: 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
9000: 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
9010: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
9020: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9030: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 42  _OK ){.    Fts5B
9040: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
9050: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
9060: 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20  er to serialize 
9070: 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20  record into */. 
9080: 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
90b0: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
90c0: 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ls */.    int iC
90d0: 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20  ookie;          
90e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69          /* Cooki
90f0: 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65  e value to store
9100: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
9110: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
9120: 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72  nt==fts5Structur
9130: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70  eCountSegments(p
9140: 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6d  Struct) );.    m
9150: 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
9160: 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
9170: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65  ));..    /* Appe
9180: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
9190: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
91a0: 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b  kie */.    iCook
91b0: 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ie = p->pConfig-
91c0: 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66  >iCookie;.    if
91d0: 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43  ( iCookie<0 ) iC
91e0: 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20 20 20  ookie = 0;..    
91f0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74  if( 0==sqlite3Ft
9200: 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
9210: 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39 2b 39  >rc, &buf, 4+9+9
9220: 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  +9) ){.      sql
9230: 69 74 65 33 46 74 73 35 50 75 74 33 32 28 62 75  ite3Fts5Put32(bu
9240: 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20  f.p, iCookie);. 
9250: 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34 3b 0a       buf.n = 4;.
9260: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9270: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
9280: 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e  (&buf, pStruct->
9290: 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 66  nLevel);.      f
92a0: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
92b0: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
92c0: 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
92d0: 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  t);.      fts5Bu
92e0: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
92f0: 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36 34 29  rint(&buf, (i64)
9300: 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
9310: 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  ounter);.    }..
9320: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
9330: 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
9340: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
9350: 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20       int iSeg;  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9380: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65  erate through se
9390: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  gments */.      
93a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
93b0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
93c0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
93d0: 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ];.      fts5Buf
93e0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
93f0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
9400: 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20  vl->nMerge);.   
9410: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
9420: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
9430: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53  , &buf, pLvl->nS
9440: 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eg);.      asser
9450: 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c  t( pLvl->nMerge<
9460: 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a  =pLvl->nSeg );..
9470: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
9480: 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65  ; iSeg<pLvl->nSe
9490: 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
94a0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
94b0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
94c0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
94d0: 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
94e0: 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
94f0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
9500: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9510: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
9520: 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20  .pgnoFirst);.   
9530: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
9540: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9550: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
9560: 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c  aSeg[iSeg].pgnoL
9570: 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ast);.      }.  
9580: 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74    }..    fts5Dat
9590: 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53  aWrite(p, FTS5_S
95a0: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20  TRUCTURE_ROWID, 
95b0: 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20  buf.p, buf.n);. 
95c0: 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
95d0: 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&buf);.  }.}..
95e0: 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69  #if 0.static voi
95f0: 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63  d fts5DebugStruc
9600: 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35 42 75  ture(int*,Fts5Bu
9610: 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75 63 74  ffer*,Fts5Struct
9620: 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ure*);.static vo
9630: 69 64 20 66 74 73 35 50 72 69 6e 74 53 74 72 75  id fts5PrintStru
9640: 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72  cture(const char
9650: 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35   *zCaption, Fts5
9660: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9670: 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ct){.  int rc = 
9680: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
9690: 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
96a0: 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
96b0: 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66  izeof(buf));.  f
96c0: 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
96d0: 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74  e(&rc, &buf, pSt
96e0: 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66  ruct);.  fprintf
96f0: 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73  (stdout, "%s: %s
9700: 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62  \n", zCaption, b
9710: 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28  uf.p);.  fflush(
9720: 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42  stdout);.  fts5B
9730: 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
9740: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9750: 65 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63  e fts5PrintStruc
9760: 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66  ture(x,y).#endif
9770: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
9780: 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73  5SegmentSize(Fts
9790: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
97a0: 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75  t *pSeg){.  retu
97b0: 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e  rn 1 + pSeg->pgn
97c0: 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67  oLast - pSeg->pg
97d0: 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  noFirst;.}../*.*
97e0: 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20  * Return a copy 
97f0: 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  of index structu
9800: 72 65 20 70 53 74 72 75 63 74 2e 20 45 78 63 65  re pStruct. Exce
9810: 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d  pt, promote as m
9820: 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  any .** segments
9830: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   as possible to 
9840: 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20  level iPromote. 
9850: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
9860: 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65  , NULL is .** re
9870: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9880: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
9890: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20  turePromoteTo(. 
98a0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
98b0: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20   int iPromote,. 
98c0: 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a   int szPromote,.
98d0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
98e0: 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e  *pStruct.){.  in
98f0: 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35  t il, is;.  Fts5
9900: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
9910: 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d  pOut = &pStruct-
9920: 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65  >aLevel[iPromote
9930: 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e  ];..  if( pOut->
9940: 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
9950: 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65   for(il=iPromote
9960: 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e  +1; il<pStruct->
9970: 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20  nLevel; il++){. 
9980: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
9990: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
99a0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
99b0: 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [il];.      if( 
99c0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72  pLvl->nMerge ) r
99d0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72  eturn;.      for
99e0: 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  (is=pLvl->nSeg-1
99f0: 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a  ; is>=0; is--){.
9a00: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d          int sz =
9a10: 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65   fts5SegmentSize
9a20: 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d  (&pLvl->aSeg[is]
9a30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
9a40: 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65  z>szPromote ) re
9a50: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 66 74  turn;.        ft
9a60: 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
9a70: 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
9a80: 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65  Struct, iPromote
9a90: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 1, 1);.       
9aa0: 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
9ab0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  urn;.        mem
9ac0: 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20  cpy(pOut->aSeg, 
9ad0: 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c  &pLvl->aSeg[is],
9ae0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
9af0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a  ctureSegment));.
9b00: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53          pOut->nS
9b10: 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c  eg++;.        pL
9b20: 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20  vl->nSeg--;.    
9b30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
9b40: 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67  ./*.** A new seg
9b50: 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65  ment has just be
9b60: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65  en written to le
9b70: 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65  vel iLvl of inde
9b80: 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  x structure.** p
9b90: 53 74 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e  Struct. This fun
9ba0: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
9bb0: 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e 74 73   if any segments
9bc0: 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f   should be promo
9bd0: 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65 73 75  ted.** as a resu
9be0: 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61 72 65  lt. Segments are
9bf0: 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f   promoted in two
9c00: 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
9c10: 2a 20 20 20 61 29 20 49 66 20 74 68 65 20 73 65  *   a) If the se
9c20: 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74  gment just writt
9c30: 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  en is smaller th
9c40: 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  an one or more s
9c50: 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  egments.**      
9c60: 77 69 74 68 69 6e 20 74 68 65 20 70 72 65 76 69  within the previ
9c70: 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20 6c 65  ous populated le
9c80: 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f  vel, it is promo
9c90: 74 65 64 20 74 6f 20 74 68 65 20 70 72 65 76 69  ted to the previ
9ca0: 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75  ous.**      popu
9cb0: 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a  lated level..**.
9cc0: 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65 20 73  **   b) If the s
9cd0: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
9ce0: 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20 74 68  ten is larger th
9cf0: 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20 73 65  an the newest se
9d00: 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20  gment on.**     
9d10: 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75 6c 61   the next popula
9d20: 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20  ted level, then 
9d30: 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e  that segment, an
9d40: 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64 6a 61  d any other adja
9d50: 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65 67  cent.**      seg
9d60: 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 61  ments that are a
9d70: 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lso smaller than
9d80: 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20 77 72   the one just wr
9d90: 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20  itten, are .**  
9da0: 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a      promoted. .*
9db0: 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d  *.** If one or m
9dc0: 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65  ore segments are
9dd0: 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73   promoted, the s
9de0: 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
9df0: 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f  is updated.** to
9e00: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a   reflect this..*
9e10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
9e20: 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
9e30: 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  te(.  Fts5Index 
9e40: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
9e50: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
9e60: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
9e70: 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c    /* Index level
9ea0: 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 2a 2f   just updated */
9eb0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
9ec0: 20 2a 70 53 74 72 75 63 74 20 20 20 20 20 20 20   *pStruct       
9ed0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
9ee0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  cture */.){.  if
9ef0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
9f00: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54  OK ){.    int iT
9f10: 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 6f  st;.    int iPro
9f20: 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69  mote = -1;.    i
9f30: 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30  nt szPromote = 0
9f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9f50: 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67  Promote anything
9f60: 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20 73 6d   this size or sm
9f70: 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74 73  aller */.    Fts
9f80: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
9f90: 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53 65  t *pSeg;   /* Se
9fa0: 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74  gment just writt
9fb0: 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  en */.    int sz
9fc0: 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
9fd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
9fe0: 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  of segment just 
9ff0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
a000: 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63  nt nSeg = pStruc
a010: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a020: 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e  nSeg;..    if( n
a030: 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Seg==0 ) return;
a040: 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74  .    pSeg = &pSt
a050: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
a060: 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d  l].aSeg[pStruct-
a070: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
a080: 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67  eg-1];.    szSeg
a090: 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67   = (1 + pSeg->pg
a0a0: 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70  noLast - pSeg->p
a0b0: 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20  gnoFirst);..    
a0c0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e  /* Check for con
a0d0: 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20  dition (a) */.  
a0e0: 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d    for(iTst=iLvl-
a0f0: 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53  1; iTst>=0 && pS
a100: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
a110: 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73  st].nSeg==0; iTs
a120: 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54  t--);.    if( iT
a130: 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st>=0 ){.      i
a140: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
a150: 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  szMax = 0;.     
a160: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
a170: 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74  vel *pTst = &pSt
a180: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73  ruct->aLevel[iTs
a190: 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t];.      assert
a1a0: 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d  ( pTst->nMerge==
a1b0: 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
a1c0: 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67  =0; i<pTst->nSeg
a1d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a1e0: 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61  int sz = pTst->a
a1f0: 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20  Seg[i].pgnoLast 
a200: 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  - pTst->aSeg[i].
a210: 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20  pgnoFirst + 1;. 
a220: 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a         if( sz>sz
a230: 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a  Max ) szMax = sz
a240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a250: 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67  if( szMax>=szSeg
a260: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
a270: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20  ondition (a) is 
a280: 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68  true. Promote th
a290: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
a2a0: 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20   on level .     
a2b0: 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65     ** iLvl to le
a2c0: 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20  vel iTst.  */.  
a2d0: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
a2e0: 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73   iTst;.        s
a2f0: 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78  zPromote = szMax
a300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a310: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69  .    /* If condi
a320: 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20  tion (a) is not 
a330: 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20  met, assume (b) 
a340: 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74 75  is true. Structu
a350: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20  rePromoteTo().  
a360: 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
a370: 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a  if it is not.  *
a380: 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f  /.    if( iPromo
a390: 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50  te<0 ){.      iP
a3a0: 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20  romote = iLvl;. 
a3b0: 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d       szPromote =
a3c0: 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20   szSeg;.    }.  
a3d0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
a3e0: 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f  romoteTo(p, iPro
a3f0: 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c  mote, szPromote,
a400: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d   pStruct);.  }.}
a410: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  .../*.** Advance
a420: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
a430: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
a440: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68   argument. If th
a450: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a  e end of the .**
a460: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70   doclist-index p
a470: 61 67 65 20 69 73 20 72 65 61 63 68 65 64 2c 20  age is reached, 
a480: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
a490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a4a0: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a4b0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a4c0: 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl){.  Fts5Data 
a4d0: 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70  *pData = pLvl->p
a4e0: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76  Data;..  if( pLv
a4f0: 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  l->iOff==0 ){.  
a500: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
a510: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70  bEof==0 );.    p
a520: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20  Lvl->iOff = 1;. 
a530: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
a540: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
a550: 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70  (&pData->p[1], p
a560: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b  Lvl->iLeafPgno);
a570: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a580: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a590: 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d  (&pData->p[pLvl-
a5a0: 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  >iOff], (u64*)&p
a5b0: 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  Lvl->iRowid);.  
a5c0: 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66    pLvl->iFirstOf
a5d0: 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a  f = pLvl->iOff;.
a5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
a5f0: 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28 69   iOff;.    for(i
a600: 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20  Off=pLvl->iOff; 
a610: 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20  iOff<pData->nn; 
a620: 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iOff++){.      i
a630: 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  f( pData->p[iOff
a640: 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20 20 20  ] ) break; .    
a650: 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  }..    if( iOff<
a660: 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pData->nn ){.   
a670: 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
a680: 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67     pLvl->iLeafPg
a690: 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c  no += (iOff - pL
a6a0: 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20  vl->iOff) + 1;. 
a6b0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
a6c0: 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
a6d0: 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  a->p[iOff], (u64
a6e0: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  *)&iVal);.      
a6f0: 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  pLvl->iRowid += 
a700: 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c  iVal;.      pLvl
a710: 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20  ->iOff = iOff;. 
a720: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a730: 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  pLvl->bEof = 1;.
a740: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
a750: 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a  urn pLvl->bEof;.
a760: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
a770: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
a780: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
a790: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
a7a0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
a7b0: 64 78 49 74 65 72 4e 65 78 74 52 28 46 74 73 35  dxIterNextR(Fts5
a7c0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
a7d0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  idxIter *pIter, 
a7e0: 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73  int iLvl){.  Fts
a7f0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
a800: 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  = &pIter->aLvl[i
a810: 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lvl];..  assert(
a820: 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76   iLvl<pIter->nLv
a830: 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44  l );.  if( fts5D
a840: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
a850: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c  ) ){.    if( (iL
a860: 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e  vl+1) < pIter->n
a870: 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73  Lvl ){.      fts
a880: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
a890: 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31  p, pIter, iLvl+1
a8a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  );.      if( pLv
a8b0: 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a  l[1].bEof==0 ){.
a8c0: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
a8d0: 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
a8e0: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ata);.        me
a8f0: 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69  mset(pLvl, 0, si
a900: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
a910: 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76  l));.        pLv
a920: 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  l->pData = fts5D
a930: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
a940: 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
a950: 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e  DX_ROWID(pIter->
a960: 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c  iSegid, iLvl, pL
a970: 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29  vl[1].iLeafPgno)
a980: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
a990: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44      if( pLvl->pD
a9a0: 61 74 61 20 29 20 66 74 73 35 44 6c 69 64 78 4c  ata ) fts5DlidxL
a9b0: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20  vlNext(pLvl);.  
a9c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a9d0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
a9e0: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
a9f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
aa00: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46 74  DlidxIterNext(Ft
aa10: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
aa20: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
aa30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
aa40: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 70  DlidxIterNextR(p
aa50: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a  , pIter, 0);.}..
aa60: 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  /*.** The iterat
aa70: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
aa80: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
aa90: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
aaa0: 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20  g fields set.** 
aab0: 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73  as follows. This
aac0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75   function sets u
aad0: 70 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  p the rest of th
aae0: 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
aaf0: 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20  at it.** points 
ab00: 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
ab10: 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  id in the doclis
ab20: 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20  t-index..**.**  
ab30: 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70   pData:.**     p
ab40: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
ab50: 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  t-index record, 
ab60: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
ab70: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
ab80: 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  led pIter->iLeaf
ab90: 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61 67 65  Pgno is the page
aba0: 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64   number the.** d
abb0: 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f 63 69  oclist is associ
abc0: 61 74 65 64 20 77 69 74 68 20 28 74 68 65 20 6f  ated with (the o
abd0: 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74 68 65  ne featuring the
abe0: 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69   term)..*/.stati
abf0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
ac00: 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c 69  terFirst(Fts5Dli
ac10: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ac20: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
ac30: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
ac40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73  l; i++){.    fts
ac50: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 70  5DlidxLvlNext(&p
ac60: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a  Iter->aLvl[i]);.
ac70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74    }.  return pIt
ac80: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ac90: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.}...static int
aca0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
acb0: 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
acc0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
acd0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
ace0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
acf0: 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   || pIter->aLvl[
ad00: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  0].bEof;.}..stat
ad10: 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64  ic void fts5Dlid
ad20: 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 49 6e  xIterLast(Fts5In
ad30: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
ad40: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
ad50: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64   int i;..  /* Ad
ad60: 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76 65 6c  vance each level
ad70: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
ad80: 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 70  ry on the last p
ad90: 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  age */.  for(i=p
ada0: 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d  Iter->nLvl-1; p-
adb0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
adc0: 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  & i>=0; i--){.  
add0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
ade0: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
adf0: 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c  Lvl[i];.    whil
ae00: 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  e( fts5DlidxLvlN
ae10: 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a  ext(pLvl)==0 );.
ae20: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
ae30: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e 30   0;..    if( i>0
ae40: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c   ){.      Fts5Dl
ae50: 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d  idxLvl *pChild =
ae60: 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20   &pLvl[-1];.    
ae70: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ae80: 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 29  e(pChild->pData)
ae90: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
aea0: 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66  Child, 0, sizeof
aeb0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
aec0: 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70  .      pChild->p
aed0: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
aee0: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
aef0: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
af00: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
af10: 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65  , i-1, pLvl->iLe
af20: 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b  afPgno).      );
af30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
af40: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
af50: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
af60: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
af70: 74 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  t to the previou
af80: 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  s entry..*/.stat
af90: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
afa0: 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c 69 64  LvlPrev(Fts5Dlid
afb0: 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69  xLvl *pLvl){.  i
afc0: 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e  nt iOff = pLvl->
afd0: 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28  iOff;..  assert(
afe0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29   pLvl->bEof==0 )
aff0: 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c  ;.  if( iOff<=pL
b000: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b  vl->iFirstOff ){
b010: 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20  .    pLvl->bEof 
b020: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
b030: 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e    u8 *a = pLvl->
b040: 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36  pData->p;.    i6
b050: 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20  4 iVal;.    int 
b060: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20  iLimit;.    int 
b070: 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72  ii;.    int nZer
b080: 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  o = 0;..    /* C
b090: 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f  urrently iOff po
b0a0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
b0b0: 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72 69  t byte of a vari
b0c0: 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a  nt. This block .
b0d0: 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74      ** decrement
b0e0: 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20  s iOff until it 
b0f0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b100: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
b110: 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a  previous .    **
b120: 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20   varint. Taking 
b130: 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64  care not to read
b140: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61   any memory loca
b150: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
b160: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  .    ** before t
b170: 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d  he buffer in mem
b180: 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69  ory.  */.    iLi
b190: 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20  mit = (iOff>9 ? 
b1a0: 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20  iOff-9 : 0);.   
b1b0: 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66   for(iOff--; iOf
b1c0: 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d  f>iLimit; iOff--
b1d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b  ){.      if( (a[
b1e0: 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d  iOff-1] & 0x80)=
b1f0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b200: 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74 56 61  }..    fts5GetVa
b210: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
b220: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
b230: 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d   pLvl->iRowid -=
b240: 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d   iVal;.    pLvl-
b250: 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20  >iLeafPgno--;.. 
b260: 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77     /* Skip backw
b270: 61 72 64 73 20 70 61 73 74 20 61 6e 79 20 30 78  ards past any 0x
b280: 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20  00 varints. */. 
b290: 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31     for(ii=iOff-1
b2a0: 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  ; ii>=pLvl->iFir
b2b0: 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d  stOff && a[ii]==
b2c0: 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  0x00; ii--){.   
b2d0: 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20     nZero++;.    
b2e0: 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c  }.    if( ii>=pL
b2f0: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26  vl->iFirstOff &&
b300: 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20   (a[ii] & 0x80) 
b310: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
b320: 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
b330: 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74   before the last
b340: 20 30 78 30 30 20 62 79 74 65 20 68 61 73 20 74   0x00 byte has t
b350: 68 65 20 30 78 38 30 20 62 69 74 0a 20 20 20 20  he 0x80 bit.    
b360: 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65    ** set. So the
b370: 20 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e   last 0x00 is on
b380: 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20 69 66  ly a varint 0 if
b390: 20 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72   there are 8 mor
b3a0: 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20  e 0x80.      ** 
b3b0: 62 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69  bytes before a[i
b3c0: 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  i]. */.      int
b3d0: 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20   bZero = 0;     
b3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
b3f0: 20 69 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f   if last 0x00 co
b400: 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  unts */.      if
b410: 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e  ( (ii-8)>=pLvl->
b420: 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20  iFirstOff ){.   
b430: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
b440: 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
b450: 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20  8 && (a[ii-j] & 
b460: 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20  0x80); j++);.   
b470: 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e       bZero = (j>
b480: 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
b490: 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29    if( bZero==0 )
b4a0: 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a   nZero--;.    }.
b4b0: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
b4c0: 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20  gno -= nZero;.  
b4d0: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69    pLvl->iOff = i
b4e0: 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d  Off - nZero;.  }
b4f0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d  ..  return pLvl-
b500: 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  >bEof;.}..static
b510: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b520: 65 72 50 72 65 76 52 28 46 74 73 35 49 6e 64 65  erPrevR(Fts5Inde
b530: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
b540: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
b550: 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69  iLvl){.  Fts5Dli
b560: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
b570: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d  Iter->aLvl[iLvl]
b580: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
b590: 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b  l<pIter->nLvl );
b5a0: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
b5b0: 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b  LvlPrev(pLvl) ){
b5c0: 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31  .    if( (iLvl+1
b5d0: 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  ) < pIter->nLvl 
b5e0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
b5f0: 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70  dxIterPrevR(p, p
b600: 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20  Iter, iLvl+1);. 
b610: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d       if( pLvl[1]
b620: 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
b630: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b640: 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
b650: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
b660: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
b670: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
b680: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  .        pLvl->p
b690: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
b6a0: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
b6b0: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
b6c0: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
b6d0: 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31  id, iLvl, pLvl[1
b6e0: 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ].iLeafPgno).   
b6f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
b700: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
b710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
b720: 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  le( fts5DlidxLvl
b730: 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b  Next(pLvl)==0 );
b740: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  .          pLvl-
b750: 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20  >bEof = 0;.     
b760: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b770: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
b780: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
b790: 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bEof;.}.static i
b7a0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
b7b0: 50 72 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a  Prev(Fts5Index *
b7c0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
b7d0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
b7e0: 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  rn fts5DlidxIter
b7f0: 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20  PrevR(p, pIter, 
b800: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  0);.}../*.** Fre
b810: 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
b820: 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  x iterator objec
b830: 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  t allocated by f
b840: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
b850: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
b860: 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
b870: 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49 74  Free(Fts5DlidxIt
b880: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
b890: 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69  ( pIter ){.    i
b8a0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
b8b0: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  0; i<pIter->nLvl
b8c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
b8d0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
b8e0: 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61  ter->aLvl[i].pDa
b8f0: 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ta);.    }.    s
b900: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
b910: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
b920: 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  c Fts5DlidxIter 
b930: 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  *fts5DlidxIterIn
b940: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
b950: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
b960: 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61        /* Fts5 Ba
b970: 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
b980: 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74   within */.  int
b990: 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9b0: 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42  True for ORDER B
b9c0: 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69  Y ASC */.  int i
b9d0: 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
b9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
b9f0: 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
ba00: 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20 20  t iLeafPg       
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba20: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
ba30: 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20  r to load dlidx 
ba40: 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  for */.){.  Fts5
ba50: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
ba60: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
ba70: 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
ba80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
ba90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
baa0: 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  bDone==0; i++){.
bab0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
bac0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
bad0: 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65  Iter) + i * size
bae0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
baf0: 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 49  ;.    Fts5DlidxI
bb00: 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20  ter *pNew;..    
bb10: 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64  pNew = (Fts5Dlid
bb20: 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  xIter*)sqlite3_r
bb30: 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42  ealloc(pIter, nB
bb40: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  yte);.    if( pN
bb50: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
bb60: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
bb70: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
bb80: 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
bb90: 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f   = FTS5_DLIDX_RO
bba0: 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69  WID(iSegid, i, i
bbb0: 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46  LeafPg);.      F
bbc0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
bbd0: 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b  l = &pNew->aLvl[
bbe0: 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20  i];.      pIter 
bbf0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65  = pNew;.      me
bc00: 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69  mset(pLvl, 0, si
bc10: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
bc20: 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  l));.      pLvl-
bc30: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
bc40: 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
bc50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
bc60: 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c  ->pData && (pLvl
bc70: 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20  ->pData->p[0] & 
bc80: 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20  0x0001)==0 ){.  
bc90: 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b        bDone = 1;
bca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
bcb0: 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31  Iter->nLvl = i+1
bcc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
bcd0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
bce0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
bcf0: 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
bd00: 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  d;.    if( bRev=
bd10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
bd20: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70  DlidxIterFirst(p
bd30: 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
bd40: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
bd50: 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74  xIterLast(p, pIt
bd60: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
bd70: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
bd80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
bd90: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
bda0: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65  pIter);.    pIte
bdb0: 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  r = 0;.  }..  re
bdc0: 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73  turn pIter;.}..s
bdd0: 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c  tatic i64 fts5Dl
bde0: 69 64 78 49 74 65 72 52 6f 77 69 64 28 46 74 73  idxIterRowid(Fts
bdf0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
be00: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74  r){.  return pIt
be10: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77  er->aLvl[0].iRow
be20: 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  id;.}.static int
be30: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
be40: 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  no(Fts5DlidxIter
be50: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
be60: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
be70: 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a  ].iLeafPgno;.}..
be80: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e  /*.** Load the n
be90: 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e  ext leaf page in
bea0: 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  to the segment i
beb0: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
bec0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
bed0: 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46  terNextPage(.  F
bee0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bf00: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
bf10: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
bf20: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
bf30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
bf40: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
bf50: 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a  e to next page *
bf60: 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  /.){.  Fts5Data 
bf70: 2a 70 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74  *pLeaf;.  Fts5St
bf80: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
bf90: 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  pSeg = pIter->pS
bfa0: 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65  eg;.  fts5DataRe
bfb0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
bfc0: 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  af);.  pIter->iL
bfd0: 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28  eafPgno++;.  if(
bfe0: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
bff0: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
c000: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
c010: 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49  NextLeaf;.    pI
c020: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  ter->pNextLeaf =
c030: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
c040: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
c050: 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
c060: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70   ){.    pIter->p
c070: 4c 65 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52  Leaf = fts5LeafR
c080: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
c090: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
c0a0: 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
c0b0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c0c0: 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  o).    );.  }els
c0d0: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  e{.    pIter->pL
c0e0: 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  eaf = 0;.  }.  p
c0f0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
c100: 65 61 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61  eaf;..  if( pLea
c110: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
c120: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61  iPgidxOff = pLea
c130: 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69  f->szLeaf;.    i
c140: 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
c150: 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a  mless(pLeaf) ){.
c160: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
c170: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65  dofDoclist = pLe
c180: 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65  af->nn+1;.    }e
c190: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
c1a0: 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66  ->iPgidxOff += f
c1b0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
c1c0: 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e  pLeaf->p[pIter->
c1d0: 69 50 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20  iPgidxOff],.    
c1e0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
c1f0: 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20  dofDoclist.     
c200: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
c210: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
c220: 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  p points to a bu
c230: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
c240: 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69  a varint to be i
c250: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a  nterpreted as a.
c260: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ** position list
c270: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
c280: 64 20 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64  d the varint and
c290: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
c2a0: 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72  er of bytes.** r
c2b0: 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75  ead. Before retu
c2c0: 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a  rning, set *pnSz
c2d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
c2e0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 70  f bytes in the p
c2f0: 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c  osition.** list,
c300: 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74   and *pbDel to t
c310: 72 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74  rue if the delet
c320: 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f  e flag is set, o
c330: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
c340: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c350: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
c360: 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c  ize(const u8 *p,
c370: 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20   int *pnSz, int 
c380: 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e  *pbDel){.  int n
c390: 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  Sz;.  int n = 0;
c3a0: 0a 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61  .  fts5FastGetVa
c3b0: 72 69 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a  rint32(p, n, nSz
c3c0: 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20  );.  assert_nc( 
c3d0: 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53  nSz>=0 );.  *pnS
c3e0: 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62  z = nSz/2;.  *pb
c3f0: 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30  Del = nSz & 0x00
c400: 30 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  01;.  return n;.
c410: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67  }../*.** Fts5Seg
c420: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
c430: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
c440: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
c450: 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69  yte of a.** posi
c460: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
c470: 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76  ield. Read the v
c480: 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c  alue of the fiel
c490: 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a  d and store it.*
c4a0: 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
c4b0: 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
c4c0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
c4d0: 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35  r.nPos.**   Fts5
c4e0: 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a  SegIter.bDel.**.
c4f0: 2a 2a 20 4c 65 61 76 65 20 46 74 73 35 53 65 67  ** Leave Fts5Seg
c500: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
c510: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
c520: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
c530: 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  he .** position 
c540: 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66  list content (if
c550: 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63   any)..*/.static
c560: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c570: 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e  rLoadNPos(Fts5In
c580: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
c590: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
c5a0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
c5b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
c5c0: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
c5d0: 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66  afOffset;  /* Of
c5e0: 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74 20  fset to read at 
c5f0: 2a 2f 0a 20 20 20 20 41 53 53 45 52 54 5f 53 5a  */.    ASSERT_SZ
c600: 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70  LEAF_OK(pIter->p
c610: 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70  Leaf);.    if( p
c620: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
c630: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
c640: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  NONE ){.      in
c650: 74 20 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74  t iEod = MIN(pIt
c660: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
c670: 74 2c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  t, pIter->pLeaf-
c680: 3e 73 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  >szLeaf);.      
c690: 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b  pIter->bDel = 0;
c6a0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
c6b0: 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  os = 1;.      if
c6c0: 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70  ( iOff<iEod && p
c6d0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
c6e0: 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Off]==0 ){.     
c6f0: 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d     pIter->bDel =
c700: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   1;.        iOff
c710: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
c720: 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74  iOff<iEod && pIt
c730: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
c740: 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
c750: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
c760: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   1;.          iO
c770: 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  ff++;.        }e
c780: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
c790: 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a  Iter->nPos = 0;.
c7a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c7b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
c7c0: 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20     int nSz;.    
c7d0: 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
c7e0: 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65  int32(pIter->pLe
c7f0: 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a  af->p, iOff, nSz
c800: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
c810: 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78  bDel = (nSz & 0x
c820: 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74  0001);.      pIt
c830: 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e  er->nPos = nSz>>
c840: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  1;.      assert_
c850: 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e  nc( pIter->nPos>
c860: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
c870: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c880: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d  et = iOff;.  }.}
c890: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
c8a0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
c8b0: 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  id(Fts5Index *p,
c8c0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c8d0: 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  ter){.  u8 *a = 
c8e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
c8f0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
c900: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
c910: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
c920: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
c930: 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52  Offset;..  ASSER
c940: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
c950: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28  r->pLeaf);.  if(
c960: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
c970: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
c980: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
c990: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
c9a0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
c9b0: 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  >pLeaf==0 ){.   
c9c0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
c9d0: 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
c9e0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
c9f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ca00: 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34    }.    iOff = 4
ca10: 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d  ;.    a = pIter-
ca20: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20  >pLeaf->p;.  }. 
ca30: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
ca40: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
ca50: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
ca60: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
ca70: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
ca80: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  set = iOff;.}../
ca90: 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  *.** Fts5SegIter
caa0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72  .iLeafOffset cur
cab0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
cac0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
cad0: 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66  of the .** "nSuf
cae0: 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20  fix" field of a 
caf0: 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70  term. Function p
cb00: 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63  arameter nKeep c
cb10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
cb20: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72  e.** of the "nPr
cb30: 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66 20  efix" field (if 
cb40: 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20  there was one - 
cb50: 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20 69  it is passed 0 i
cb60: 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65  f this is.** the
cb70: 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74   first term in t
cb80: 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a  he segment)..**.
cb90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cba0: 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a   populates:.**.*
cbb0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
cbc0: 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65  term.**   Fts5Se
cbd0: 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a  gIter.rowid.**.*
cbe0: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e  * accordingly an
cbf0: 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53 65  d leaves (Fts5Se
cc00: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
cc10: 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  t) set to the co
cc20: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20  ntent of.** the 
cc30: 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c  first position l
cc40: 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f  ist. The positio
cc50: 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67  n list belonging
cc60: 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a   to document .**
cc70: 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 52   (Fts5SegIter.iR
cc80: 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  owid)..*/.static
cc90: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
cca0: 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e  rLoadTerm(Fts5In
ccb0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
ccc0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
ccd0: 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20  nKeep){.  u8 *a 
cce0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
ccf0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66  p;        /* Buf
cd00: 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61  fer to read data
cd10: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
cd20: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
cd30: 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66  afOffset;  /* Of
cd40: 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74 20  fset to read at 
cd50: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  */.  int nNew;  
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
cd80: 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20   new data */..  
cd90: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
cda0: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
cdb0: 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 69  , nNew);.  if( i
cdc0: 4f 66 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e  Off+nNew>pIter->
cdd0: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
cde0: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
cdf0: 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72  RRUPT;.    retur
ce00: 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  n;.  }.  pIter->
ce10: 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  term.n = nKeep;.
ce20: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
ce30: 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
ce40: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
ce50: 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  w, &a[iOff]);.  
ce60: 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20  iOff += nNew;.  
ce70: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
ce80: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ce90: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
cea0: 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
ceb0: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65  LeafPgno;.  pIte
cec0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
ced0: 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49   iOff;..  if( pI
cee0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d  ter->iPgidxOff>=
cef0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
cf00: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
cf10: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
cf20: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
cf30: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
cf40: 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
cf50: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
cf60: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
cf70: 74 33 32 28 26 61 5b 70 49 74 65 72 2d 3e 69 50  t32(&a[pIter->iP
cf80: 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61  gidxOff], nExtra
cf90: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45  );.    pIter->iE
cfa0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e  ndofDoclist += n
cfb0: 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74  Extra;.  }..  ft
cfc0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
cfd0: 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  id(p, pIter);.}.
cfe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
cff0: 35 53 65 67 49 74 65 72 4e 65 78 74 28 46 74 73  5SegIterNext(Fts
d000: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
d010: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74  Iter*, int*);.st
d020: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d030: 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73  gIterNext_Revers
d040: 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  e(Fts5Index*, Ft
d050: 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a  s5SegIter*, int*
d060: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  );.static void f
d070: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e  ts5SegIterNext_N
d080: 6f 6e 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  one(Fts5Index*, 
d090: 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e  Fts5SegIter*, in
d0a0: 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69  t*);..static voi
d0b0: 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74  d fts5SegIterSet
d0c0: 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Next(Fts5Index *
d0d0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
d0e0: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
d0f0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
d100: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
d110: 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  E ){.    pIter->
d120: 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49  xNext = fts5SegI
d130: 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 3b  terNext_Reverse;
d140: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
d150: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
d160: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
d170: 4e 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  NE ){.    pIter-
d180: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
d190: 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20  IterNext_None;. 
d1a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
d1b0: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d1c0: 65 67 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a  egIterNext;.  }.
d1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
d1e0: 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ize the iterator
d1f0: 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
d200: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
d210: 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a   the entries in.
d220: 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e  ** segment pSeg.
d230: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   The iterator is
d240: 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
d250: 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
d260: 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  y when .** this 
d270: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
d280: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
d290: 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
d2a0: 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
d2b0: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
d2c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
d2d0: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
d2e0: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
d2f0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
d300: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
d310: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
d320: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d330: 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a  ts5SegIterInit(.
d340: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f    /* FTS index o
d370: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
d380: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
d390: 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65  *pSeg,     /* De
d3a0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67  scription of seg
d3b0: 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ment */.  Fts5Se
d3c0: 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
d3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
d3e0: 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
d3f0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67  */.){.  if( pSeg
d400: 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29  ->pgnoFirst==0 )
d410: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
d420: 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65 67  ppens if the seg
d430: 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73  ment is being us
d440: 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74  ed as an input t
d450: 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  o an incremental
d460: 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e  .    ** merge an
d470: 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61  d all data has a
d480: 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72 69  lready been "tri
d490: 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74  mmed". See funct
d4a0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54  ion.    ** fts5T
d4b0: 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f  rimSegments() fo
d4c0: 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68  r details. In th
d4d0: 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74 68  is case leave th
d4e0: 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79  e iterator empty
d4f0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
d500: 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65  ler will see the
d510: 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d   (pIter->pLeaf==
d520: 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  0) and assume th
d530: 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20  e iterator is.  
d540: 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65    ** at EOF alre
d550: 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ady. */.    asse
d560: 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
d570: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
d580: 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  n;.  }..  if( p-
d590: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
d5a0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  {.    memset(pIt
d5b0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
d5c0: 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35  Iter));.    fts5
d5d0: 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70  SegIterSetNext(p
d5e0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49  , pIter);.    pI
d5f0: 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
d600: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d610: 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  afPgno = pSeg->p
d620: 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20  gnoFirst-1;.    
d630: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
d640: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
d650: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
d660: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d670: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d680: 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73  fset = 4;.    as
d690: 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
d6a0: 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20  pLeaf->nn>4 );. 
d6b0: 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4c     assert( fts5L
d6c0: 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
d6d0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34  pIter->pLeaf)==4
d6e0: 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   );.    pIter->i
d6f0: 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72  PgidxOff = pIter
d700: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b  ->pLeaf->szLeaf+
d710: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
d720: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
d730: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73  ter, 0);.    fts
d740: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
d750: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
d760: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d770: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
d780: 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74  ver called on it
d790: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
d7a0: 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46  by calls to.** F
d7b0: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20  ts5IndexQuery() 
d7c0: 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44  with the FTS5IND
d7d0: 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c  EX_QUERY_DESC fl
d7e0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ag set..**.** Th
d7f0: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e  e iterator is in
d800: 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74   an unusual stat
d810: 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
d820: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20  tion is called: 
d830: 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  the.** Fts5SegIt
d840: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76  er.iLeafOffset v
d850: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
d860: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  o the offset of 
d870: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d880: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
d890: 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72  t size field for
d8a0: 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
d8b0: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
d8c0: 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65   page..** Fts5Se
d8d0: 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73  gIter.rowid is s
d8e0: 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64  et, but nPos and
d8f0: 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a   bDel are not..*
d900: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d910: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
d920: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
d930: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
d940: 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76  e last .** relev
d950: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
d960: 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65   page and, if ne
d970: 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c  cessary, initial
d980: 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f  izes the .** aRo
d990: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20  widOffset[] and 
d9a0: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72  iRowidOffset var
d9b0: 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20  iables. At this 
d9c0: 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74  point the iterat
d9d0: 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20  or.** is in its 
d9e0: 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20  regular state - 
d9f0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
da00: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
da10: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62  o the first.** b
da20: 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  yte of the posit
da30: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
da40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
da50: 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a   said rowid..*/.
da60: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
da70: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
da80: 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  itPage(Fts5Index
da90: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
daa0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
dab0: 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
dac0: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
dad0: 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
dae0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
daf0: 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e   int i = pIter->
db00: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75  iLeafOffset;.  u
db10: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
db20: 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52  eaf->p;.  int iR
db30: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a  owidOffset = 0;.
db40: 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e  .  if( n>pIter->
db50: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
db60: 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e  .    n = pIter->
db70: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20  iEndofDoclist;. 
db80: 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c   }..  ASSERT_SZL
db90: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
dba0: 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  eaf);.  while( 1
dbb0: 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c   ){.    i64 iDel
dbc0: 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ta = 0;..    if(
dbd0: 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
dbe0: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
dbf0: 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20      /* todo */. 
dc00: 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20       if( i<n && 
dc10: 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[i]==0 ){.     
dc20: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
dc30: 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d  if( i<n && a[i]=
dc40: 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  =0 ) i++;.      
dc50: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
dc60: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
dc70: 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
dc80: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
dc90: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
dca0: 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  i], &nPos, &bDum
dcb0: 6d 79 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  my);.      i += 
dcc0: 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nPos;.    }.    
dcd0: 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b  if( i>=n ) break
dce0: 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47  ;.    i += fts5G
dcf0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20  etVarint(&a[i], 
dd00: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
dd10: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
dd20: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20  d += iDelta;..  
dd30: 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72    /* If necessar
dd40: 79 2c 20 67 72 6f 77 20 74 68 65 20 70 49 74 65  y, grow the pIte
dd50: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
dd60: 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20  ] array. */.    
dd70: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74  if( iRowidOffset
dd80: 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  >=pIter->nRowidO
dd90: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
dda0: 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d  nt nNew = pIter-
ddb0: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20  >nRowidOffset + 
ddc0: 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  8;.      int *aN
ddd0: 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
dde0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
ddf0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20  ->aRowidOffset, 
de00: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29  nNew*sizeof(int)
de10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
de20: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
de30: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
de40: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72  OMEM;.        br
de50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
de60: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
de70: 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20  Offset = aNew;. 
de80: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77       pIter->nRow
de90: 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b  idOffset = nNew;
dea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
deb0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
dec0: 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20  iRowidOffset++] 
ded0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
dee0: 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  fset;.    pIter-
def0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
df00: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
df10: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52  RowidOffset = iR
df20: 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74  owidOffset;.  ft
df30: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
df40: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  s(p, pIter);.}..
df50: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
df60: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
df70: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46  ReverseNewPage(F
df80: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
df90: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
dfa0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
dfb0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
dfc0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
dfd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
dfe0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
dff0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
e000: 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52   );..  fts5DataR
e010: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
e020: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
e030: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Leaf = 0;.  whil
e040: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
e050: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c  _OK && pIter->iL
e060: 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
e070: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
e080: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
e090: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
e0a0: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  LeafPgno--;.    
e0b0: 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
e0c0: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
e0d0: 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20  ENT_ROWID(.     
e0e0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67       pIter->pSeg
e0f0: 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d  ->iSegid, pIter-
e100: 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29  >iLeafPgno.    )
e110: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
e120: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72  ){.      /* iTer
e130: 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20  mLeafOffset may 
e140: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65  be equal to szLe
e150: 61 66 20 69 66 20 74 68 65 20 74 65 72 6d 20 69  af if the term i
e160: 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  s the last.     
e170: 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65   ** thing on the
e180: 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65   page - i.e. the
e190: 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 73 20   first rowid is 
e1a0: 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
e1b0: 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20   page..      ** 
e1c0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65 61  In this case lea
e1d0: 76 65 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  ve pIter->pLeaf=
e1e0: 3d 30 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f  =0, this iterato
e1f0: 72 20 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a  r is at EOF. */.
e200: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e210: 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  >iLeafPgno==pIte
e220: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
e230: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
e240: 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
e250: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
e260: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
e270: 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e  eafOffset<pNew->
e280: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
e290: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
e2a0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
e2b0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e2c0: 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69  ffset = pIter->i
e2d0: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a  TermLeafOffset;.
e2e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e2f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
e300: 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20  nt iRowidOff;.  
e310: 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
e320: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
e330: 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20  owidOff(pNew);. 
e340: 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
e350: 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dOff ){.        
e360: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
e370: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
e380: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e390: 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b  set = iRowidOff;
e3a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e3b0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49   }..      if( pI
e3c0: 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
e3d0: 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70        u8 *a = &p
e3e0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70  Iter->pLeaf->p[p
e3f0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e400: 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  t];.        pIte
e410: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
e420: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
e430: 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  a, (u64*)&pIter-
e440: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
e450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e460: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
e470: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e  s5DataRelease(pN
e480: 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
e490: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
e4a0: 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
e4b0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
e4c0: 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e  oclist = pIter->
e4d0: 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20  pLeaf->nn+1;.   
e4e0: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
e4f0: 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
e500: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
e510: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
e520: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
e530: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
e540: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75  cond argument cu
e550: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
e560: 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61  s to a delete ma
e570: 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d  rker. A delete m
e580: 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72  arker is an entr
e590: 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65 0a  y with a 0 byte.
e5a0: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
e5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e5c0: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
e5d0: 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a  mpty(Fts5Index *
e5e0: 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  p, Fts5Iter *pIt
e5f0: 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  er){.  Fts5SegIt
e600: 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
e610: 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61  r->aSeg[pIter->a
e620: 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
e630: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
e640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e650: 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70  pSeg->pLeaf && p
e660: 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d  Seg->nPos==0);.}
e670: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
e680: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
e690: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
e6a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ..**.** This ver
e6b0: 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49  sion of fts5SegI
e6c0: 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c  terNext() is onl
e6d0: 79 20 75 73 65 64 20 62 79 20 72 65 76 65 72 73  y used by revers
e6e0: 65 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  e iterators..*/.
e6f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e700: 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65  SegIterNext_Reve
e710: 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rse(.  Fts5Index
e720: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
e730: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
e740: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
e750: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
e760: 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
e770: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
e780: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
e790: 6e 74 20 2a 70 62 55 6e 75 73 65 64 20 20 20 20  nt *pbUnused    
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e7b0: 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  * Unused */.){. 
e7c0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
e7d0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e7e0: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a  ITER_REVERSE );.
e7f0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e800: 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
e810: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
e820: 70 62 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69 66  pbUnused);..  if
e830: 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f  ( pIter->iRowidO
e840: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 75  ffset>0 ){.    u
e850: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
e860: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20  eaf->p;.    int 
e870: 69 4f 66 66 3b 0a 20 20 20 20 69 36 34 20 69 44  iOff;.    i64 iD
e880: 65 6c 74 61 3b 0a 0a 20 20 20 20 70 49 74 65 72  elta;..    pIter
e890: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d  ->iRowidOffset--
e8a0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
e8b0: 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72  afOffset = pIter
e8c0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70  ->aRowidOffset[p
e8d0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
e8e0: 65 74 5d 3b 0a 20 20 20 20 66 74 73 35 53 65 67  et];.    fts5Seg
e8f0: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
e900: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 4f 66 66  pIter);.    iOff
e910: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
e920: 66 66 73 65 74 3b 0a 20 20 20 20 69 66 28 20 70  ffset;.    if( p
e930: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
e940: 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
e950: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 4f  NONE ){.      iO
e960: 66 66 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f  ff += pIter->nPo
e970: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  s;.    }.    fts
e980: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
e990: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
e9a0: 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta);.    pIter->
e9b0: 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61  iRowid -= iDelta
e9c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
e9d0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
e9e0: 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65  eNewPage(p, pIte
e9f0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
ea00: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
ea10: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
ea20: 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  ext entry..**.**
ea30: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
ea40: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
ea50: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
ea60: 69 66 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 61  if detail=none a
ea70: 6e 64 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74  nd the.** iterat
ea80: 6f 72 20 69 73 20 6e 6f 74 20 61 20 72 65 76 65  or is not a reve
ea90: 72 73 65 20 64 69 72 65 63 74 69 6f 6e 20 69 74  rse direction it
eaa0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
eab0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
eac0: 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20 46  erNext_None(.  F
ead0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eaf0: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
eb00: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
eb10: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
eb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
eb30: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
eb40: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65  e */.  int *pbNe
eb50: 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  wTerm           
eb60: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
eb70: 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20  et for new term 
eb80: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  */.){.  int iOff
eb90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
eba0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
ebb0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 74 65  .  assert( (pIte
ebc0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
ebd0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
ebe0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
ebf0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
ec00: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
ec10: 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53 53  L_NONE );..  ASS
ec20: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
ec30: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69  ter->pLeaf);.  i
ec40: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
ec50: 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20  afOffset;..  /* 
ec60: 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  Next entry is on
ec70: 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 2a   the next page *
ec80: 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  /.  if( pIter->p
ec90: 53 65 67 20 26 26 20 69 4f 66 66 3e 3d 70 49 74  Seg && iOff>=pIt
eca0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
ecb0: 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67  f ){.    fts5Seg
ecc0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
ecd0: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
ece0: 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e  p->rc || pIter->
ecf0: 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72  pLeaf==0 ) retur
ed00: 6e 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  n;.    pIter->iR
ed10: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 69 4f  owid = 0;.    iO
ed20: 66 66 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 69  ff = 4;.  }..  i
ed30: 66 28 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e 69  f( iOff<pIter->i
ed40: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a  EndofDoclist ){.
ed50: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
ed60: 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72  y is on the curr
ed70: 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ent page */.    
ed80: 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
ed90: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
eda0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 49  ts5GetVarint(&pI
edb0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f  ter->pLeaf->p[iO
edc0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
edd0: 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta);.    pIter->
ede0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
edf0: 66 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ff;.    pIter->i
ee00: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
ee10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49  .  }else if( (pI
ee20: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
ee30: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
ee40: 4d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  M)==0 ){.    if(
ee50: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a   pIter->pSeg ){.
ee60: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20        int nKeep 
ee70: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 0;.      if( i
ee80: 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72  Off!=fts5LeafFir
ee90: 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d  stTermOff(pIter-
eea0: 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  >pLeaf) ){.     
eeb0: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
eec0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
eed0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  r->pLeaf->p[iOff
eee0: 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
eef0: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
ef00: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
ef10: 66 66 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  ff;.      fts5Se
ef20: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
ef30: 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a   pIter, nKeep);.
ef40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ef50: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
ef60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73   = 0;.      cons
ef70: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
ef80: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
ef90: 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
efa0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
efb0: 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  t(p->pHash);.   
efc0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
efd0: 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
efe0: 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70  Hash, &zTerm, &p
eff0: 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
f000: 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d       if( pList==
f010: 30 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f  0 ) goto next_no
f020: 6e 65 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70 49  ne_eof;.      pI
f030: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20  ter->pLeaf->p = 
f040: 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20  (u8*)pList;.    
f050: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
f060: 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  nn = nList;.    
f070: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
f080: 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a  szLeaf = nList;.
f090: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
f0a0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69  dofDoclist = nLi
f0b0: 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
f0c0: 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
f0d0: 70 2d 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74 65  p->rc,&pIter->te
f0e0: 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rm, (int)strlen(
f0f0: 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65  zTerm), (u8*)zTe
f100: 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  rm);.      pIter
f110: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f120: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
f130: 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ist, (u64*)&pIte
f140: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
f150: 7d 0a 0a 20 20 20 20 69 66 28 20 70 62 4e 65 77  }..    if( pbNew
f160: 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72  Term ) *pbNewTer
f170: 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 1;.  }else{.
f180: 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f      goto next_no
f190: 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66  ne_eof;.  }..  f
f1a0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
f1b0: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  os(p, pIter);.. 
f1c0: 20 72 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e   return;. next_n
f1d0: 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44  one_eof:.  fts5D
f1e0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
f1f0: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
f200: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a  r->pLeaf = 0;.}.
f210: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
f220: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
f230: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
f240: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
f250: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
f260: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
f270: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
f280: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
f290: 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  t .** is not con
f2a0: 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
f2b0: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
f2c0: 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66   reaches EOF. If
f2d0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
f2e0: 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
f2f0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
f300: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
f310: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
f320: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
f330: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a  ts5SegIterNext(.
f340: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
f370: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
f380: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
f390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f3a0: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
f3b0: 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ance */.  int *p
f3c0: 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20  bNewTerm        
f3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f3e0: 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65  : Set for new te
f3f0: 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  rm */.){.  Fts5D
f400: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
f410: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74  er->pLeaf;.  int
f420: 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65   iOff;.  int bNe
f430: 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  wTerm = 0;.  int
f440: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75 38   nKeep = 0;.  u8
f450: 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20   *a;.  int n;.. 
f460: 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54 65   assert( pbNewTe
f470: 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54  rm==0 || *pbNewT
f480: 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  erm==0 );.  asse
f490: 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
f4a0: 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
f4b0: 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20  TAIL_NONE );..  
f4c0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
f4d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  e end of the pos
f4e0: 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69  ition list withi
f4f0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
f500: 67 65 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c 65  ge. */.  a = pLe
f510: 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c 65  af->p;.  n = pLe
f520: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41  af->szLeaf;..  A
f530: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
f540: 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d  pLeaf);.  iOff =
f550: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f560: 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f  set + pIter->nPo
f570: 73 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e  s;..  if( iOff<n
f580: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e   ){.    /* The n
f590: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
f5a0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f5b0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 5f  . */.    assert_
f5c0: 6e 63 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d  nc( iOff<=pIter-
f5d0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29  >iEndofDoclist )
f5e0: 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ;.    if( iOff>=
f5f0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
f600: 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 62 4e  list ){.      bN
f610: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
f620: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
f630: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
f640: 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  (pLeaf) ){.     
f650: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
f660: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
f670: 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
f680: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f690: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
f6a0: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
f6b0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
f6c0: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26  rint(&a[iOff], &
f6d0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70  iDelta);.      p
f6e0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
f6f0: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 61 73  iDelta;.      as
f700: 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e  sert_nc( iDelta>
f710: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0 );.    }.    p
f720: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f730: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c  t = iOff;..  }el
f740: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53  se if( pIter->pS
f750: 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  eg==0 ){.    con
f760: 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30  st u8 *pList = 0
f770: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f780: 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20   *zTerm = 0;.   
f790: 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a   int nList = 0;.
f7a0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49 74      assert( (pIt
f7b0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
f7c0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
f7d0: 29 20 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20 29  ) || pbNewTerm )
f7e0: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49  ;.    if( 0==(pI
f7f0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
f800: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
f810: 4d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  M) ){.      sqli
f820: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
f830: 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20  ext(p->pHash);. 
f840: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
f850: 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d  HashScanEntry(p-
f860: 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20  >pHash, &zTerm, 
f870: 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
f880: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f890: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
f8a0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f8b0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
f8c0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f8d0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  af = 0;.    }els
f8e0: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
f8f0: 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29  pLeaf->p = (u8*)
f900: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  pList;.      pIt
f910: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20  er->pLeaf->nn = 
f920: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
f930: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
f940: 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  f = nList;.     
f950: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
f960: 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b  clist = nList+1;
f970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
f980: 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
f990: 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
f9a0: 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
f9b0: 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  erm),.          
f9c0: 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20  (u8*)zTerm);.   
f9d0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
f9e0: 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56  ffset = fts5GetV
f9f0: 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36  arint(pList, (u6
fa00: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
fa10: 64 29 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65 77  d);.      *pbNew
fa20: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Term = 1;.    }.
fa30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66    }else{.    iOf
fa40: 66 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65  f = 0;.    /* Ne
fa50: 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20  xt entry is not 
fa60: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
fa70: 61 67 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  age */.    while
fa80: 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( iOff==0 ){.   
fa90: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
faa0: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
fab0: 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20  ;.      pLeaf = 
fac0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20  pIter->pLeaf;.  
fad0: 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
fae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
faf0: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
fb00: 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  (pLeaf);.      i
fb10: 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 4c  f( (iOff = fts5L
fb20: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
fb30: 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66 66  (pLeaf)) && iOff
fb40: 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  <pLeaf->szLeaf )
fb50: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
fb60: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
fb70: 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70  Varint(&pLeaf->p
fb80: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
fb90: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
fba0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
fbb0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
fbc0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
fbd0: 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e  Leaf->nn>pLeaf->
fbe0: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
fbf0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
fc00: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
fc10: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
fc20: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
fc30: 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b        &pLeaf->p[
fc40: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20  pLeaf->szLeaf], 
fc50: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
fc60: 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 29  list.          )
fc70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fc80: 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69    }.      else i
fc90: 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65  f( pLeaf->nn>pLe
fca0: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
fcb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67        pIter->iPg
fcc0: 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e  idxOff = pLeaf->
fcd0: 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74  szLeaf + fts5Get
fce0: 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20  Varint32(.      
fcf0: 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b        &pLeaf->p[
fd00: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20  pLeaf->szLeaf], 
fd10: 69 4f 66 66 0a 20 20 20 20 20 20 20 20 29 3b 0a  iOff.        );.
fd20: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fd30: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
fd40: 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  f;.        pIter
fd50: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
fd60: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
fd70: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
fd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
fd90: 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61  rt_nc( iOff<pLea
fda0: 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20  f->szLeaf );.   
fdb0: 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c 65 61     if( iOff>pLea
fdc0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
fdd0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
fde0: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
fdf0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
fe00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
fe10: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
fe20: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20  iterator is now 
fe30: 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72  at EOF. If so, r
fe40: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
fe50: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
fe60: 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4e  af ){.    if( bN
fe70: 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  ewTerm ){.      
fe80: 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  if( pIter->flags
fe90: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
fea0: 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20  ONETERM ){.     
feb0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
fec0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
fed0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
fee0: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
fef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ff00: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
ff10: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
ff20: 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 66  Keep);.        f
ff30: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
ff40: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
ff50: 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77 54        if( pbNewT
ff60: 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d  erm ) *pbNewTerm
ff70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
ff80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
ff90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ffa0: 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20 62 79  could be done by
ffb0: 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53 65 67   calling fts5Seg
ffc0: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20  IterLoadNPos(). 
ffd0: 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  But.      ** thi
ffe0: 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69  s block is parti
fff0: 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61  cularly performa
10000 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f  nce critical, so
10010 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
10020 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c    ** code is inl
10030 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  ined. .      **.
10040 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20        ** Later: 
10050 53 77 69 74 63 68 65 64 20 62 61 63 6b 20 74 6f  Switched back to
10060 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
10070 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65 20 69  NPos() because i
10080 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20 20 20  t supports.     
10090 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   ** detail=none 
100a0 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e  mode. Not ideal.
100b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
100c0 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61  int nSz;.      a
100d0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
100e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
100f0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
10100 69 4c 65 61 66 4f 66 66 73 65 74 3c 3d 70 49 74  iLeafOffset<=pIt
10110 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 3b  er->pLeaf->nn );
10120 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
10130 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
10140 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65  ->pLeaf->p, pIte
10150 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c 20  r->iLeafOffset, 
10160 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65  nSz);.      pIte
10170 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26  r->bDel = (nSz &
10180 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20   0x0001);.      
10190 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53  pIter->nPos = nS
101a0 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65  z>>1;.      asse
101b0 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50  rt_nc( pIter->nP
101c0 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  os>=0 );.    }. 
101d0 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57   }.}..#define SW
101e0 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b  APVAL(T, a, b) {
101f0 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61   T tmp; tmp=a; a
10200 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64  =b; b=tmp; }..#d
10210 65 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53  efine fts5IndexS
10220 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66  kipVarint(a, iOf
10230 66 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  f) {            
10240 5c 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  \.  int iEnd = i
10250 4f 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20  Off+9;          
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28      \.  while( (
10280 61 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30  a[iOff++] & 0x80
10290 29 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29  ) && iOff<iEnd )
102a0 3b 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a  ;       \.}../*.
102b0 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
102c0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
102d0 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
102e0 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69  rowid in a docli
102f0 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  st. This.** func
10300 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74  tion sets the it
10310 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61  erator up so tha
10320 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65  t iterates in re
10330 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f  verse order thro
10340 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69  ugh.** the docli
10350 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
10360 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
10370 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20  verse(Fts5Index 
10380 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
10390 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44  *pIter){.  Fts5D
103a0 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
103b0 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
103c0 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  ;.  Fts5Data *pL
103d0 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ast = 0;.  int p
103e0 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20  gnoLast = 0;..  
103f0 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20  if( pDlidx ){.  
10400 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70    int iSegid = p
10410 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
10420 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74  id;.    pgnoLast
10430 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
10440 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
10450 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61    pLast = fts5Da
10460 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
10470 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
10480 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b  gid, pgnoLast));
10490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
104a0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
104b0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20  pIter->pLeaf;   
104c0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
104d0 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
104e0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c     /* Currently,
104f0 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
10500 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
10510 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
10520 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69  e of.    ** posi
10530 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e  tion-list conten
10540 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
10550 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74  t rowid. Back it
10560 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20   up so that it. 
10570 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20     ** points to 
10580 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10590 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
105a0 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ize field. */.  
105b0 20 20 69 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a    int iPoslist;.
105c0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
105d0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  TermLeafPgno==pI
105e0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
105f0 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74  {.      iPoslist
10600 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
10610 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d  eafOffset;.    }
10620 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 50 6f 73  else{.      iPos
10630 6c 69 73 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a  list = 4;.    }.
10640 20 20 20 20 66 74 73 35 49 6e 64 65 78 53 6b 69      fts5IndexSki
10650 70 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70  pVarint(pLeaf->p
10660 2c 20 69 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  , iPoslist);.   
10670 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
10680 73 65 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a  set = iPoslist;.
10690 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
106a0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
106b0 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65  e then the large
106c0 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  st rowid for the
106d0 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
106e0 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20  term may not be 
106f0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
10700 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73  rrent page. So s
10710 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f  earch forward to
10720 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72  .    ** see wher
10730 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61  e said rowid rea
10740 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20  lly is.  */.    
10750 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  if( pIter->iEndo
10760 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d  fDoclist>=pLeaf-
10770 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
10780 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
10790 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
107a0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
107b0 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20  ter->pSeg;..    
107c0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f    /* The last ro
107d0 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
107e0 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e  st may not be on
107f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
10800 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20  e. Search.      
10810 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69  ** forward to fi
10820 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  nd the page cont
10830 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20  aining the last 
10840 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20  rowid.  */.     
10850 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d   for(pgno=pIter-
10860 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70  >iLeafPgno+1; !p
10870 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53  ->rc && pgno<=pS
10880 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67  eg->pgnoLast; pg
10890 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  no++){.        i
108a0 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
108b0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
108c0 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29  g->iSegid, pgno)
108d0 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44 61  ;.        Fts5Da
108e0 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44  ta *pNew = fts5D
108f0 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73 29  ataRead(p, iAbs)
10900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
10910 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
10920 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72  int iRowid, bTer
10930 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20  mless;.         
10940 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65   iRowid = fts5Le
10950 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
10960 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
10970 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73   bTermless = fts
10980 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
10990 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
109a0 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20   if( iRowid ){. 
109b0 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50 56             SWAPV
109c0 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e  AL(Fts5Data*, pN
109d0 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20  ew, pLast);.    
109e0 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74          pgnoLast
109f0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20   = pgno;.       
10a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
10a10 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
10a20 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
10a30 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30  if( bTermless==0
10a40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
10a50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10a60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
10a70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20  Last is NULL at 
10a80 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
10a90 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   the last rowid 
10aa0 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
10ab0 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68  .  ** lies on th
10ac0 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
10ad0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
10ae0 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74  e iterator. In t
10af0 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70  his case .  ** p
10b00 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10b10 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  t is already set
10b20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
10b30 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
10b40 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61  ize.  ** field a
10b50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10b60 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
10b70 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
10b80 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  age..  **.  ** O
10b90 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e  r, if pLast is n
10ba0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
10bb0 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
10bc0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
10bd0 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20  ast.  ** rowid. 
10be0 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e  In this case con
10bf0 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72 61  figure the itera
10c00 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  tor so that it p
10c10 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a  oints to the.  *
10c20 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
10c30 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f   this page..  */
10c40 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a  .  if( pLast ){.
10c50 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
10c60 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10c70 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
10c80 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
10c90 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70  f = pLast;.    p
10ca0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10cb0 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
10cc0 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
10cd0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61  irstRowidOff(pLa
10ce0 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  st);.    iOff +=
10cf0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
10d00 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLast->p[iOff], 
10d10 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
10d20 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72  owid);.    pIter
10d30 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
10d40 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66  iOff;..    if( f
10d50 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
10d60 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20  s(pLast) ){.    
10d70 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
10d80 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e  oclist = pLast->
10d90 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nn+1;.    }else{
10da0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
10db0 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74  ndofDoclist = ft
10dc0 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
10dd0 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  ff(pLast);.    }
10de0 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  ..  }..  fts5Seg
10df0 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
10e00 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  age(p, pIter);.}
10e10 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
10e20 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
10e30 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
10e40 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20  irst rowid of a 
10e50 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72  doclist..** Ther
10e60 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
10e70 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
10e80 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74  with the final t
10e90 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65  erm on the curre
10ea0 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20  nt .** page. If 
10eb0 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
10ec0 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72   is the last ter
10ed0 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c  m on the page, l
10ee0 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c  oad the .** docl
10ef0 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64  ist-index from d
10f00 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  isk and initiali
10f10 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61  ze an iterator a
10f20 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t (pIter->pDlidx
10f30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
10f40 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
10f50 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78  dDlidx(Fts5Index
10f60 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
10f70 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
10f80 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  iSeg = pIter->pS
10f90 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e  eg->iSegid;.  in
10fa0 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
10fb0 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
10fc0 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
10fd0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
10fe0 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
10ff0 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61  ; /* Current lea
11000 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73  f data */..  ass
11010 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
11020 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
11030 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
11040 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
11050 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  idx==0 );..  /* 
11060 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72  Check if the cur
11070 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64  rent doclist end
11080 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20  s on this page. 
11090 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75  If it does, retu
110a0 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69  rn.  ** early wi
110b0 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68  thout loading th
110c0 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
110d0 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74  (as it belongs t
110e0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20  o a different.  
110f0 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66  ** term. */.  if
11100 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
11110 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
11120 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20  LeafPgno .   && 
11130 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
11140 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65  list<pLeaf->szLe
11150 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  af .  ){.    ret
11160 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65  urn;.  }..  pIte
11170 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35  r->pDlidx = fts5
11180 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
11190 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74   bRev, iSeg, pIt
111a0 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
111b0 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
111c0 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
111d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
111e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
111f0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
11200 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61  s.** no valid va
11210 6c 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20  lues except for 
11220 74 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e  the Fts5SegIter.
11230 70 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72  pLeaf member var
11240 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66  iable. This.** f
11250 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
11260 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66   the leaf page f
11270 6f 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69  or a term matchi
11280 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ng (pTerm/nTerm)
11290 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
112a0 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73  pecified term is
112b0 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61   found on the pa
112c0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ge, then the ite
112d0 72 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  rator is left.**
112e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
112f0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65   If argument bGe
11300 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
11310 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75   term is not fou
11320 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61  nd,.** the itera
11330 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
11340 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  ting at EOF..**.
11350 2a 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e  ** If bGe is non
11360 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70  -zero and the sp
11370 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
11380 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
11390 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
113a0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
113b0 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
113c0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
113d0 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20  ment that.** is 
113e0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
113f0 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20  specified term, 
11400 65 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72  even if this ter
11410 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a  m is not on the.
11420 2a 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  ** current page.
11430 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11440 66 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20  fts5LeafSeek(.  
11450 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  /* Leave any err
11480 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a  or code here */.
11490 20 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20    int bGe,      
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
114c0 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46  >= search */.  F
114d0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
114e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
114f0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65  * Iterator to se
11500 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ek */.  const u8
11510 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
11520 72 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm      /* Term 
11530 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
11540 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
11550 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
11560 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
11570 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20  .  int szLeaf = 
11580 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
11590 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Leaf;.  int n = 
115a0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
115b0 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20  ;..  int nMatch 
115c0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70  = 0;.  int nKeep
115d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77   = 0;.  int nNew
115e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72   = 0;.  int iTer
115f0 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69  mOff;.  int iPgi
11600 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
11610 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
11620 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  nt offset in pgi
11630 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64  dx */.  int bEnd
11640 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  OfPage = 0;..  a
11650 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
11660 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50  LITE_OK );..  iP
11670 67 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  gidx = szLeaf;. 
11680 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
11690 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
116a0 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29  gidx], iTermOff)
116b0 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d  ;.  iOff = iTerm
116c0 4f 66 66 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e  Off;.  if( iOff>
116d0 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  n ){.    p->rc =
116e0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
116f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
11700 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
11710 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
11720 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62 79   how many new by
11730 74 65 73 20 61 72 65 20 69 6e 20 74 68 69 73 20  tes are in this 
11740 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35  term */.    fts5
11750 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
11760 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a  a, iOff, nNew);.
11770 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d      if( nKeep<nM
11780 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 67 6f  atch ){.      go
11790 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
117a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
117b0 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74  ert( nKeep>=nMat
117c0 63 68 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  ch );.    if( nK
117d0 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20  eep==nMatch ){. 
117e0 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20       int nCmp;. 
117f0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
11800 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65    nCmp = MIN(nNe
11810 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29  w, nTerm-nMatch)
11820 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
11830 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20   i<nCmp; i++){. 
11840 20 20 20 20 20 20 20 69 66 28 20 61 5b 69 4f 66         if( a[iOf
11850 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74  f+i]!=pTerm[nMat
11860 63 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ch+i] ) break;. 
11870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61       }.      nMa
11880 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20  tch += i;..     
11890 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74   if( nTerm==nMat
118a0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
118b0 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20  ( i==nNew ){.   
118c0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72         goto sear
118d0 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20 20  ch_success;.    
118e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
118f0 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
11900 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20  _failed;.       
11910 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
11920 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69  f( i<nNew && a[i
11930 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61  Off+i]>pTerm[nMa
11940 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  tch] ){.        
11950 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c  goto search_fail
11960 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
11970 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67 69 64  }..    if( iPgid
11980 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62 45  x>=n ){.      bE
11990 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20 20  ndOfPage = 1;.  
119a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
119b0 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20  ..    iPgidx += 
119c0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
119d0 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65  &a[iPgidx], nKee
119e0 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66  p);.    iTermOff
119f0 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69   += nKeep;.    i
11a00 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
11a10 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e  .    if( iOff>=n
11a20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
11a30 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
11a40 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
11a50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64    }..    /* Read
11a60 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64   the nKeep field
11a70 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65 72   of the next ter
11a80 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61  m. */.    fts5Fa
11a90 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
11aa0 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20   iOff, nKeep);. 
11ab0 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c   }.. search_fail
11ac0 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30  ed:.  if( bGe==0
11ad0 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61   ){.    fts5Data
11ae0 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
11af0 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
11b00 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
11b10 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
11b20 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20   if( bEndOfPage 
11b30 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
11b40 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
11b50 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
11b60 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
11b70 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74  ->pLeaf==0 ) ret
11b80 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70  urn;.      a = p
11b90 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
11ba0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65        if( fts5Le
11bb0 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74  afIsTermless(pIt
11bc0 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b  er->pLeaf)==0 ){
11bd0 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20  .        iPgidx 
11be0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11bf0 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  szLeaf;.        
11c00 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
11c10 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
11c20 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64  ->pLeaf->p[iPgid
11c30 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20  x], iOff);.     
11c40 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
11c50 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
11c60 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
11c70 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
11c80 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
11c90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11ca0 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20          nKeep = 
11cb0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 65  0;.          iTe
11cc0 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20  rmOff = iOff;.  
11cd0 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49 74 65          n = pIte
11ce0 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20  r->pLeaf->nn;.  
11cf0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
11d00 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11d10 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
11d20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11d30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11d40 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
11d50 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  1 );.  }.. searc
11d60 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20 70 49  h_success:..  pI
11d70 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
11d80 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a   = iOff + nNew;.
11d90 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
11da0 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72  afOffset = pIter
11db0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
11dc0 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
11dd0 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
11de0 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73  LeafPgno;..  fts
11df0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
11e00 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
11e10 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a   nKeep, pTerm);.
11e20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
11e30 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
11e40 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
11e50 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20  w, &a[iOff]);.. 
11e60 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29   if( iPgidx>=n )
11e70 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
11e80 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
11e90 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
11ea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
11eb0 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50  t nExtra;.    iP
11ec0 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
11ed0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
11ee0 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  x], nExtra);.   
11ef0 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
11f00 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66  clist = iTermOff
11f10 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20   + nExtra;.  }. 
11f20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
11f30 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66  f = iPgidx;..  f
11f40 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
11f50 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  wid(p, pIter);. 
11f60 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
11f70 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
11f80 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  }..static sqlite
11f90 33 5f 73 74 6d 74 20 2a 66 74 73 35 49 64 78 53  3_stmt *fts5IdxS
11fa0 65 6c 65 63 74 53 74 6d 74 28 46 74 73 35 49 6e  electStmt(Fts5In
11fb0 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dex *p){.  if( p
11fc0 2d 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20  ->pIdxSelect==0 
11fd0 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
11fe0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
11ff0 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73  pConfig;.    fts
12000 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
12010 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c  t(p, &p->pIdxSel
12020 65 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ect, sqlite3_mpr
12030 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
12040 22 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f  "SELECT pgno FRO
12050 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20  M '%q'.'%q_idx' 
12060 57 48 45 52 45 20 22 0a 20 20 20 20 20 20 20 20  WHERE ".        
12070 20 20 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74    "segid=? AND t
12080 65 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20  erm<=? ORDER BY 
12090 74 65 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20  term DESC LIMIT 
120a0 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  1",.          pC
120b0 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e  onfig->zDb, pCon
120c0 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  fig->zName.    )
120d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
120e0 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 3b 0a 7d  p->pIdxSelect;.}
120f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
12100 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49  ze the object pI
12110 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ter to point to 
12120 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
12130 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a   within segment.
12140 2a 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65 72  ** pSeg. If ther
12150 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
12160 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  m in the index, 
12170 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
12180 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a  set to EOF..**.*
12190 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
121a0 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
121b0 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
121c0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
121d0 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
121e0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
121f0 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
12200 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12210 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
12220 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
12230 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
12240 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20  IterSeekInit(.  
12250 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
12280 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
12290 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
122a0 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
122b0 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
122c0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122e0 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
122f0 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  X_XXX flags */. 
12300 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
12310 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
12320 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
12330 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  of segment */.  
12340 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
12350 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
12360 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
12370 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ulate */.){.  in
12380 74 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74  t iPg = 1;.  int
12390 20 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20   bGe = (flags & 
123a0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
123b0 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c  SCAN);.  int bDl
123c0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  idx = 0;        
123d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
123e0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
123f0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
12400 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12410 70 49 64 78 53 65 6c 65 63 74 20 3d 20 30 3b 0a  pIdxSelect = 0;.
12420 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d  .  assert( bGe==
12430 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
12440 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
12450 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
12460 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
12470 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
12480 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
12490 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
124a0 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
124b0 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
124c0 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69   sets stack vari
124d0 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20  able iPg to the 
124e0 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
124f0 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63   that may.  ** c
12500 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65  ontain term (pTe
12510 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74  rm/nTerm), if it
12520 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
12530 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  he segment. */. 
12540 20 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74   pIdxSelect = ft
12550 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28  s5IdxSelectStmt(
12560 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20  p);.  if( p->rc 
12570 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
12580 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64  te3_bind_int(pId
12590 78 53 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67  xSelect, 1, pSeg
125a0 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c  ->iSegid);.  sql
125b0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
125c0 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54  IdxSelect, 2, pT
125d0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49  erm, nTerm, SQLI
125e0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
125f0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
12600 6c 69 74 65 33 5f 73 74 65 70 28 70 49 64 78 53  lite3_step(pIdxS
12610 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36  elect) ){.    i6
12620 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  4 val = sqlite3_
12630 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 64 78 53  column_int(pIdxS
12640 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
12650 50 67 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e  Pg = (int)(val>>
12660 31 29 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d  1);.    bDlidx =
12670 20 28 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b   (val & 0x0001);
12680 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73  .  }.  p->rc = s
12690 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64  qlite3_reset(pId
126a0 78 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28  xSelect);..  if(
126b0 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46   iPg<pSeg->pgnoF
126c0 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20  irst ){.    iPg 
126d0 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
126e0 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  t;.    bDlidx = 
126f0 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  0;.  }..  pIter-
12700 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  >iLeafPgno = iPg
12710 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49   - 1;.  fts5SegI
12720 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
12730 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49  Iter);..  if( pI
12740 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
12750 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70    fts5LeafSeek(p
12760 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54  , bGe, pIter, pT
12770 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d  erm, nTerm);.  }
12780 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
12790 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d  QLITE_OK && bGe=
127a0 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =0 ){.    pIter-
127b0 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
127c0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
127d0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
127e0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
127f0 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
12800 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
12810 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
12820 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
12830 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a  EGITER_REVERSE;.
12840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12850 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
12860 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
12870 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65  oadDlidx(p, pIte
12880 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12890 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
128a0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
128b0 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  SC ){.        ft
128c0 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
128d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
128e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
128f0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e   fts5SegIterSetN
12900 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  ext(p, pIter);..
12910 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a    /* Either:.  *
12920 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65  *.  **   1) an e
12930 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
12940 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20  d, or.  **   2) 
12950 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
12960 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20  nts to EOF, or. 
12970 20 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65   **   3) the ite
12980 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
12990 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65  an entry with te
129a0 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  rm (pTerm/nTerm)
129b0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74  , or.  **   4) t
129c0 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  he FTS5INDEX_QUE
129d0 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73  RY_SCAN flag was
129e0 20 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65   set and the ite
129f0 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a  rator points.  *
12a00 2a 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74  *      to an ent
12a10 72 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67  ry with a term g
12a20 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
12a30 71 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e  qual to (pTerm/n
12a40 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  Term)..  */.  as
12a50 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
12a60 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  ITE_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 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49  /* 1 */.   || pI
12aa0 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20  ter->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 2f 2a 20 32              /* 2
12ae0 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75   */.   || fts5Bu
12af0 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28  fferCompareBlob(
12b00 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54  &pIter->term, pT
12b10 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20  erm, nTerm)==0  
12b20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a          /* 3 */.
12b30 20 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74     || (bGe && ft
12b40 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
12b50 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  lob(&pIter->term
12b60 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e  , pTerm, nTerm)>
12b70 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b  0)  /* 4 */.  );
12b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
12b90 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20  lize the object 
12ba0 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  pIter to point t
12bb0 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  o term pTerm/nTe
12bc0 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  rm within the.**
12bd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
12be0 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20  table. If there 
12bf0 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20  is no such term 
12c00 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
12c10 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61  e, the .** itera
12c20 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
12c30 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
12c40 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
12c50 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
12c60 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
12c70 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
12c80 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
12c90 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
12ca0 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
12cb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12cc0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12ce0 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49  fts5SegIterHashI
12cf0 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
12d00 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12d10 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
12d20 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
12d30 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
12d40 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
12d50 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
12d60 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
12d90 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
12da0 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  gs */.  Fts5SegI
12db0 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
12dc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
12dd0 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
12de0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
12df0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pList = 0;.  int
12e00 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f   nList = 0;.  co
12e10 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20  nst u8 *z = 0;. 
12e20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61   int n = 0;..  a
12e30 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
12e40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
12e50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
12e60 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  ..  if( pTerm==0
12e70 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
12e80 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
12e90 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  N) ){.    p->rc 
12ea0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
12eb0 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61  hScanInit(p->pHa
12ec0 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  sh, (const char*
12ed0 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a  )pTerm, nTerm);.
12ee0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
12ef0 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
12f00 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
12f10 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c  ar**)&z, &pList,
12f20 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20   &nList);.    n 
12f30 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c  = (z ? (int)strl
12f40 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  en((const char*)
12f50 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65  z) : 0);.  }else
12f60 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  {.    pIter->fla
12f70 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
12f80 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20  ER_ONETERM;.    
12f90 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51  sqlite3Fts5HashQ
12fa0 75 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  uery(p->pHash, (
12fb0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72  const char*)pTer
12fc0 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74  m, nTerm, &pList
12fd0 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a  , &nList);.    z
12fe0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20   = pTerm;.    n 
12ff0 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20  = nTerm;.  }..  
13000 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
13010 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
13020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
13030 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
13040 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
13050 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61   n, z);.    pLea
13060 66 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f  f = fts5IdxMallo
13070 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
13080 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20  Data));.    if( 
13090 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72  pLeaf==0 ) retur
130a0 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20  n;.    pLeaf->p 
130b0 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
130c0 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c    pLeaf->nn = pL
130d0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c  eaf->szLeaf = nL
130e0 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ist;.    pIter->
130f0 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20  pLeaf = pLeaf;. 
13100 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
13110 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56  ffset = fts5GetV
13120 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20  arint(pLeaf->p, 
13130 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
13140 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72  owid);.    pIter
13150 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
13160 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20  = pLeaf->nn;..  
13170 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
13180 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
13190 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  SC ){.      pIte
131a0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
131b0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
131c0 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
131d0 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
131e0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
131f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
13200 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
13210 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
13220 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53    }.  }..  fts5S
13230 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c  egIterSetNext(p,
13240 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
13250 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61  * Zero the itera
13260 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
13270 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
13280 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13290 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
132a0 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49  (Fts5SegIter *pI
132b0 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
132c0 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
132d0 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61  erm);.  fts5Data
132e0 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
132f0 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61 74  Leaf);.  fts5Dat
13300 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
13310 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66 74  pNextLeaf);.  ft
13320 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
13330 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a  pIter->pDlidx);.
13340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13350 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
13360 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  et);.  memset(pI
13370 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
13380 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a  ts5SegIter));.}.
13390 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
133a0 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EBUG../*.** This
133b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
133c0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
133d0 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72   big assert() pr
133e0 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e  ocedure implemen
133f0 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73  ted by.** fts5As
13400 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
13410 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73  up(). It ensures
13420 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
13430 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
13440 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73  d.** in *pRes is
13450 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
13460 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  ult of comparing
13470 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
13480 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a  itions of the.**
13490 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a   two iterators..
134a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
134b0 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
134c0 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73  sonResult(.  Fts
134d0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  5Iter *pIter, . 
134e0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
134f0 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ,.  Fts5SegIter 
13500 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75  *p2,.  Fts5CResu
13510 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e  lt *pRes.){.  in
13520 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65  t i1 = p1 - pIte
13530 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69  r->aSeg;.  int i
13540 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e  2 = p2 - pIter->
13550 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d  aSeg;..  if( p1-
13560 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c  >pLeaf || p2->pL
13570 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70  eaf ){.    if( p
13580 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  1->pLeaf==0 ){. 
13590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
135a0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b  s->iFirst==i2 );
135b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
135c0 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  2->pLeaf==0 ){. 
135d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
135e0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b  s->iFirst==i1 );
135f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13600 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
13610 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d  (p1->term.n, p2-
13620 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
13630 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
13640 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d  (p1->term.p, p2-
13650 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a  >term.p, nMin);.
13660 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
13670 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72   ) res = p1->ter
13680 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e  m.n - p2->term.n
13690 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  ;..      if( res
136a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
136b0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
136c0 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20  rmEq==1 );.     
136d0 20 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69     assert( p1->i
136e0 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69  Rowid!=p2->iRowi
136f0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73  d );.        res
13700 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20   = ((p1->iRowid 
13710 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70  > p2->iRowid)==p
13720 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31  Iter->bRev) ? -1
13730 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   : 1;.      }els
13740 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
13750 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
13760 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ==0 );.      }..
13770 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
13780 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
13790 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
137a0 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  =i1 );.      }el
137b0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
137c0 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
137d0 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ==i2 );.      }.
137e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
137f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13800 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
13810 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ss SQLITE_DEBUG 
13820 69 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20  is defined when 
13830 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  this module.** i
13840 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74  s compiled. In t
13850 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66  hat case, this f
13860 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e  unction is essen
13870 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74  tially an assert
13880 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
13890 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
138a0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
138b0 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
138c0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a  aFirst[] array.*
138d0 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a  * are correct..*
138e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
138f0 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
13900 72 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78  rSetup(Fts5Index
13910 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70   *p, Fts5Iter *p
13920 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
13930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13940 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
13950 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65   *pFirst = &pIte
13960 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
13970 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
13980 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ];.    int i;..
13990 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69      assert( (pFi
139a0 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d  rst->pLeaf==0)==
139b0 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66  pIter->base.bEof
139c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
139d0 6b 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53  k that pIter->iS
139e0 77 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65  witchRowid is se
139f0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
13a00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13a10 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
13a20 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
13a30 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
13a40 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20  ->aSeg[i];.     
13a50 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69   assert( p1==pFi
13a60 72 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  rst .           
13a70 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  || p1->pLeaf==0 
13a80 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66  .           || f
13a90 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
13aa0 28 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20  (&pFirst->term, 
13ab0 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20  &p1->term) .    
13ac0 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52         || p1->iR
13ad0 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77  owid==pIter->iSw
13ae0 69 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20  itchRowid.      
13af0 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f       || (p1->iRo
13b00 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74  wid<pIter->iSwit
13b10 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
13b20 3e 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20  >bRev.      );. 
13b30 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
13b40 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
13b50 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46  ; i+=2){.      F
13b60 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d  ts5SegIter *p1 =
13b70 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d   &pIter->aSeg[i]
13b80 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  ;.      Fts5SegI
13b90 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72  ter *p2 = &pIter
13ba0 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20  ->aSeg[i+1];.   
13bb0 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a     Fts5CResult *
13bc0 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
13bd0 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53  First[(pIter->nS
13be0 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20  eg + i) / 2];.  
13bf0 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f      fts5AssertCo
13c00 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70  mparisonResult(p
13c10 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52  Iter, p1, p2, pR
13c20 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  es);.    }..    
13c30 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65  for(i=1; i<(pIte
13c40 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b  r->nSeg / 2); i+
13c50 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
13c60 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13c70 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
13c80 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46  ->aFirst[i*2].iF
13c90 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74  irst ];.      Ft
13ca0 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20  s5SegIter *p2 = 
13cb0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
13cc0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b  ter->aFirst[i*2+
13cd0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
13ce0 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a     Fts5CResult *
13cf0 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
13d00 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20  First[i];.      
13d10 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
13d20 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
13d30 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
13d40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
13d50 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  se.# define fts5
13d60 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
13d70 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66  etup(x,y).#endif
13d80 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63  ../*.** Do the c
13d90 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73  omparison necess
13da0 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ary to populate 
13db0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
13dc0 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ut]..**.** If th
13dd0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
13de0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
13df0 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64  en it is the ind
13e00 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a  ex of an entry.*
13e10 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e  * in the pIter->
13e20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61  aSeg[] array tha
13e30 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20  t is (a) not at 
13e40 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69  EOF, and (b) poi
13e50 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65  nting.** to a ke
13e60 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c  y that is a dupl
13e70 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
13e80 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74  , higher priorit
13e90 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69  y, .** segment-i
13ea0 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70  terator in the p
13eb0 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61  Seg->aSeg[] arra
13ec0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
13ed0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
13ee0 43 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65 72  Compare(Fts5Iter
13ef0 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75   *pIter, int iOu
13f00 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20  t){.  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 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
13f30 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35  f left-hand Fts5
13f40 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
13f50 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   i2;            
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f70 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68  Index of right-h
13f80 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
13f90 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20  */.  int iRes;. 
13fa0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
13fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13fc0 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74   /* Left-hand Ft
13fd0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
13fe0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20  ts5SegIter *p2; 
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14000 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73  * Right-hand Fts
14010 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
14020 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
14030 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
14040 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72  [iOut];..  asser
14050 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e  t( iOut<pIter->n
14060 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b  Seg && iOut>0 );
14070 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
14080 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74  ->bRev==0 || pIt
14090 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a  er->bRev==1 );..
140a0 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74    if( iOut>=(pIt
140b0 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20  er->nSeg/2) ){. 
140c0 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20     i1 = (iOut - 
140d0 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a  pIter->nSeg/2) *
140e0 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20   2;.    i2 = i1 
140f0 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  + 1;.  }else{.  
14100 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46    i1 = pIter->aF
14110 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69  irst[iOut*2].iFi
14120 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49  rst;.    i2 = pI
14130 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
14140 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  *2+1].iFirst;.  
14150 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d  }.  p1 = &pIter-
14160 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20  >aSeg[i1];.  p2 
14170 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
14180 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65  2];..  pRes->bTe
14190 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20  rmEq = 0;.  if( 
141a0 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20  p1->pLeaf==0 ){ 
141b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
141c0 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p1 is at EOF */.
141d0 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
141e0 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70   }else if( p2->p
141f0 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f  Leaf==0 ){     /
14200 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f  * If p2 is at EO
14210 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20  F */.    iRes = 
14220 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  i1;.  }else{.   
14230 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42   int res = fts5B
14240 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31  ufferCompare(&p1
14250 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72  ->term, &p2->ter
14260 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d  m);.    if( res=
14270 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
14280 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20  rt( i2>i1 );.   
14290 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30     assert( i2!=0
142a0 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e   );.      pRes->
142b0 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20  bTermEq = 1;.   
142c0 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69     if( p1->iRowi
142d0 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b  d==p2->iRowid ){
142e0 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65  .        p1->bDe
142f0 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20  l = p2->bDel;.  
14300 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b        return i2;
14310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
14320 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
14330 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d > p2->iRowid)=
14340 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
14350 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  -1 : +1;.    }. 
14360 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
14370 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
14380 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73  <0 ){.      iRes
14390 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = i1;.    }else
143a0 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
143b0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
143c0 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28  pRes->iFirst = (
143d0 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74 75  u16)iRes;.  retu
143e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
143f0 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72  ove the seg-iter
14400 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
14410 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
14420 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c  rowid on page iL
14430 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69  eafPgno..** It i
14440 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65  s an error if le
14450 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65  af iLeafPgno doe
14460 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63  s not exist or c
14470 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64  ontains no rowid
14480 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
14490 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74  d fts5SegIterGot
144a0 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64  oPage(.  Fts5Ind
144b0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
144c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
144d0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
144e0 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
144f0 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
14500 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
14510 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
14520 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29   int iLeafPgno.)
14530 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61  {.  assert( iLea
14540 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65  fPgno>pIter->iLe
14550 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28  afPgno );..  if(
14560 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
14570 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
14580 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
14590 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
145a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44  }else{.    fts5D
145b0 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
145c0 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20  ->pNextLeaf);.  
145d0 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65    pIter->pNextLe
145e0 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  af = 0;.    pIte
145f0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
14600 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20  LeafPgno-1;.    
14610 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
14620 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
14630 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
14640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
14650 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d  Iter->iLeafPgno=
14660 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20  =iLeafPgno );.. 
14670 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14690 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
146a0 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
146b0 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20  pLeaf->p;.      
146c0 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
146d0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20  Leaf->szLeaf;.. 
146e0 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35       iOff = fts5
146f0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
14700 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  f(pIter->pLeaf);
14710 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
14720 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a  4 || iOff>=n ){.
14730 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14740 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
14750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14760 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
14770 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
14780 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
14790 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
147a0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
147b0 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
147c0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
147d0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
147e0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
147f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
14800 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
14810 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
14820 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14830 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74  t until it is at
14840 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77   or .** past row
14850 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64  id iFrom. Regard
14860 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
14870 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20  e of iFrom, the 
14880 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61  iterator is.** a
14890 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61  lways advanced a
148a0 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f  t least once..*/
148b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
148c0 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d  5SegIterNextFrom
148d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
148e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
148f0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
14900 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
14910 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
14920 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
14930 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
14940 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20  dvance */.  i64 
14950 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20  iMatch          
14960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
14970 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
14980 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61  at least this fa
14990 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52  r */.){.  int bR
149a0 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
149b0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
149c0 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
149d0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
149e0 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c  idx = pIter->pDl
149f0 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66  idx;.  int iLeaf
14a00 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
14a10 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62  eafPgno;.  int b
14a20 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  Move = 1;..  ass
14a30 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
14a40 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
14a50 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
14a60 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
14a70 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28  idx );.  assert(
14a80 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b   pIter->pLeaf );
14a90 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20  ..  if( bRev==0 
14aa0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66  ){.    while( !f
14ab0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
14ac0 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d  p, pDlidx) && iM
14ad0 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74  atch>fts5DlidxIt
14ae0 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20  erRowid(pDlidx) 
14af0 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67  ){.      iLeafPg
14b00 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
14b10 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
14b20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
14b30 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
14b40 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  x);.    }.    as
14b50 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67  sert_nc( iLeafPg
14b60 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no>=pIter->iLeaf
14b70 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b  Pgno || p->rc );
14b80 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67  .    if( iLeafPg
14b90 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
14ba0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gno ){.      fts
14bb0 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
14bc0 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66  (p, pIter, iLeaf
14bd0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Pgno);.      bMo
14be0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
14bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
14c00 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  t( pIter->pNextL
14c10 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eaf==0 );.    as
14c20 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74  sert( iMatch<pIt
14c30 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20  er->iRowid );.  
14c40 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c    while( !fts5Dl
14c50 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
14c60 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c  lidx) && iMatch<
14c70 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
14c80 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20  id(pDlidx) ){.  
14c90 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
14ca0 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29  rPrev(p, pDlidx)
14cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61  ;.    }.    iLea
14cc0 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64  fPgno = fts5Dlid
14cd0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
14ce0 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  );..    assert( 
14cf0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
14d00 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69  (p, pDlidx) || i
14d10 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d  LeafPgno<=pIter-
14d20 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20  >iLeafPgno );.. 
14d30 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
14d40 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  <pIter->iLeafPgn
14d50 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  o ){.      pIter
14d60 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
14d70 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20  eafPgno+1;.     
14d80 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
14d90 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49  rseNewPage(p, pI
14da0 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  ter);.      bMov
14db0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
14dc0 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  ..  do{.    if( 
14dd0 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d 3d  bMove && p->rc==
14de0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74 65  SQLITE_OK ) pIte
14df0 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74 65  r->xNext(p, pIte
14e00 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
14e10 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
14e20 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
14e30 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72  bRev==0 && pIter
14e40 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  ->iRowid>=iMatch
14e50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
14e60 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74  ( bRev!=0 && pIt
14e70 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74  er->iRowid<=iMat
14e80 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
14e90 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68  bMove = 1;.  }wh
14ea0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
14eb0 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  TE_OK );.}.../*.
14ec0 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72  ** Free the iter
14ed0 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
14ee0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14ef0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
14f00 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
14f10 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35  ltiIterFree(Fts5
14f20 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
14f30 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
14f40 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
14f50 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
14f60 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
14f70 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
14f80 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d  (&pIter->aSeg[i]
14f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
14fa0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
14fb0 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74  e(pIter->pStruct
14fc0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
14fd0 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f  rFree(&pIter->po
14fe0 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  slist);.    sqli
14ff0 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
15000 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
15010 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
15020 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73  rAdvanced(.  Fts
15030 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15050 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
15060 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
15070 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49  /.  Fts5Iter *pI
15080 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
15090 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
150a0 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
150b0 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
150c0 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20    int iChanged, 
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
150f0 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
15100 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  advanced */.  in
15110 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20  t iMinset       
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15130 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69   Minimum entry i
15140 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65  n aFirst[] to se
15150 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
15160 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d  .  for(i=(pIter-
15170 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
15180 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26  2; i>=iMinset &&
15190 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
151a0 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69  K; i=i/2){.    i
151b0 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20  nt iEq;.    if( 
151c0 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
151d0 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49  IterDoCompare(pI
151e0 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20  ter, i)) ){.    
151f0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15200 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
15210 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 61  eg[iEq];.      a
15220 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
15230 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
15240 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20   pSeg->xNext(p, 
15250 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSeg, 0);.      
15260 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
15270 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
15280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74  .}../*.** Sub-it
15290 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20  erator iChanged 
152a0 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  of iterator pIte
152b0 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  r has just been 
152c0 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69  advanced. It sti
152d0 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ll.** points to 
152e0 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68  the same term th
152f0 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69  ough - just a di
15300 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54  fferent rowid. T
15310 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
15320 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61  attempts to upda
15330 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
15340 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46  of the pIter->aF
15350 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67  irst[] according
15360 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  ly..** If it doe
15370 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  s so successfull
15380 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  y, 0 is returned
15390 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a  . Otherwise 1..*
153a0 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  *.** If non-zero
153b0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
153c0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
153d0 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74  call fts5MultiIt
153e0 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20  erAdvanced().** 
153f0 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  on the iterator 
15400 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75  instead. That fu
15410 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
15420 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65  same as this one
15430 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
15440 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d   it deals with m
15450 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
15460 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  cases as well..*
15470 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  / .static int ft
15480 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
15490 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ceRowid(.  Fts5I
154a0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
154b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
154c0 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65  erator to update
154d0 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20   aFirst[] array 
154e0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68  for */.  int iCh
154f0 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20  anged,          
15500 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15510 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f  x of sub-iterato
15520 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20  r just advanced 
15530 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
15540 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a 20 20   **ppFirst.){.  
15550 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65  Fts5SegIter *pNe
15560 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  w = &pIter->aSeg
15570 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69  [iChanged];..  i
15580 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d  f( pNew->iRowid=
15590 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  =pIter->iSwitchR
155a0 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77  owid.   || (pNew
155b0 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e  ->iRowid<pIter->
155c0 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70  iSwitchRowid)==p
155d0 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a  Iter->bRev.  ){.
155e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46      int i;.    F
155f0 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68  ts5SegIter *pOth
15600 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
15610 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30  g[iChanged ^ 0x0
15620 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  001];.    pIter-
15630 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
15640 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d  pIter->bRev ? SM
15650 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c  ALLEST_INT64 : L
15660 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
15670 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
15680 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
15690 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  ; 1; i=i/2){.   
156a0 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a     Fts5CResult *
156b0 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
156c0 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20  First[i];..     
156d0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
156e0 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73  Leaf );.      as
156f0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
15700 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72  mEq==0 || pOther
15710 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20  ->pLeaf );..    
15720 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72    if( pRes->bTer
15730 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  mEq ){.        i
15740 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d  f( pNew->iRowid=
15750 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20  =pOther->iRowid 
15760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
15770 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
15780 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72  else if( (pOther
15790 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69  ->iRowid>pNew->i
157a0 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
157b0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
157c0 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
157d0 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69  owid = pOther->i
157e0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
157f0 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a   pNew = pOther;.
15800 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
15810 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  ( (pOther->iRowi
15820 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  d>pIter->iSwitch
15830 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
15840 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
15850 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
15860 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69  owid = pOther->i
15870 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
15880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15890 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75  Res->iFirst = (u
158a0 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65 72  16)(pNew - pIter
158b0 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20 69  ->aSeg);.      i
158c0 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b  f( i==1 ) break;
158d0 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  ..      pOther =
158e0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
158f0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e  Iter->aFirst[i ^
15900 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20   0x0001].iFirst 
15910 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  ];.    }.  }..  
15920 2a 70 70 46 69 72 73 74 20 3d 20 70 4e 65 77 3b  *ppFirst = pNew;
15930 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
15940 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49  /*.** Set the pI
15950 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61 62  ter->bEof variab
15960 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  le based on the 
15970 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75 62  state of the sub
15980 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73  -iterators..*/.s
15990 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
159a0 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 46  ultiIterSetEof(F
159b0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
159c0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
159d0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
159e0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
159f0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
15a00 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45    pIter->base.bE
15a10 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66  of = pSeg->pLeaf
15a20 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53  ==0;.  pIter->iS
15a30 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53 65  witchRowid = pSe
15a40 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  g->iRowid;.}../*
15a50 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
15a60 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
15a70 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
15a80 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
15a90 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
15aa0 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
15ab0 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73  5Index.rc. It is
15ac0 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65   not .** conside
15ad0 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
15ae0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
15af0 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20  ches EOF, or if 
15b00 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  it is already at
15b10 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68   .** EOF when th
15b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15b30 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
15b40 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
15b50 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
15b60 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
15b70 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69  Iter *pIter,.  i
15b80 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt bFrom,       
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ba0 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65  * True if argume
15bb0 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69  nt iFrom is vali
15bc0 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d  d */.  i64 iFrom
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
15bf0 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61  e at least as fa
15c00 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a  r as this */.){.
15c10 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d    int bUseFrom =
15c20 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72 74   bFrom;.  assert
15c30 28 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  ( pIter->base.bE
15c40 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  of==0 );.  while
15c50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15c60 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  OK ){.    int iF
15c70 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46  irst = pIter->aF
15c80 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a  irst[1].iFirst;.
15c90 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
15ca0 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 53 65   = 0;.    Fts5Se
15cb0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
15cc0 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73  Iter->aSeg[iFirs
15cd0 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t];.    assert( 
15ce0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15cf0 20 29 3b 0a 20 20 20 20 69 66 28 20 62 55 73 65   );.    if( bUse
15d00 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44  From && pSeg->pD
15d10 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 66 74  lidx ){.      ft
15d20 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
15d30 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
15d40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15d50 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
15d60 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65  p, pSeg, &bNewTe
15d70 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rm);.    }..    
15d80 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
15d90 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
15da0 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74       || fts5Mult
15db0 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69  iIterAdvanceRowi
15dc0 64 28 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c  d(pIter, iFirst,
15dd0 20 26 70 53 65 67 29 0a 20 20 20 20 29 7b 0a 20   &pSeg).    ){. 
15de0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
15df0 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49  erAdvanced(p, pI
15e00 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b  ter, iFirst, 1);
15e10 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
15e20 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72  IterSetEof(pIter
15e30 29 3b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  );.      pSeg = 
15e40 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74  &pIter->aSeg[pIt
15e50 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15e60 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 66 28  irst];.      if(
15e70 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
15e80 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
15e90 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
15ea0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
15eb0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
15ec0 65 72 74 28 20 70 53 65 67 3d 3d 26 70 49 74 65  ert( pSeg==&pIte
15ed0 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61  r->aSeg[pIter->a
15ee0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
15ef0 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20   && pSeg->pLeaf 
15f00 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
15f10 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d 3d 30 20  ->bSkipEmpty==0 
15f20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b  || pSeg->nPos ){
15f30 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
15f40 65 74 4f 75 74 70 75 74 73 28 70 49 74 65 72 2c  etOutputs(pIter,
15f50 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 72 65   pSeg);.      re
15f60 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
15f70 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20  bUseFrom = 0;.  
15f80 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
15f90 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15fa0 78 74 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78  xt2(.  Fts5Index
15fb0 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72   *p, .  Fts5Iter
15fc0 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a   *pIter,.  int *
15fd0 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
15fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15ff0 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69 67 68  T: True if *migh
16000 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d 20 2a  t* be new term *
16010 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
16020 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
16030 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   );.  if( p->rc=
16040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16050 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 30    *pbNewTerm = 0
16060 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
16070 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
16080 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
16090 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74 73 35  irst;.      Fts5
160a0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
160b0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
160c0 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  rst];.      int 
160d0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20  bNewTerm = 0;.. 
160e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
160f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
16100 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65  .      pSeg->xNe
16110 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65  xt(p, pSeg, &bNe
16120 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66  wTerm);.      if
16130 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
16140 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20   || bNewTerm .  
16150 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74       || fts5Mult
16160 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69  iIterAdvanceRowi
16170 64 28 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c  d(pIter, iFirst,
16180 20 26 70 53 65 67 29 0a 20 20 20 20 20 20 29 7b   &pSeg).      ){
16190 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
161a0 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70  tiIterAdvanced(p
161b0 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c  , pIter, iFirst,
161c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   1);.        fts
161d0 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
161e0 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  (pIter);.       
161f0 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
16200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
16210 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
16220 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72  erSetup(p, pIter
16230 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  );..    }while( 
16240 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
16250 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29  mpty(p, pIter) )
16260 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
16270 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
16280 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46 74 73  Outputs_Noop(Fts
16290 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 31 2c  5Iter *pUnused1,
162a0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 55   Fts5SegIter *pU
162b0 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  nused2){.  UNUSE
162c0 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73 65 64  D_PARAM2(pUnused
162d0 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a 7d 0a  1, pUnused2);.}.
162e0 0a 73 74 61 74 69 63 20 46 74 73 35 49 74 65 72  .static Fts5Iter
162f0 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41   *fts5MultiIterA
16300 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e 64 65  lloc(.  Fts5Inde
16310 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
16320 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
16330 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
16340 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
16350 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46 74 73  nt nSeg.){.  Fts
16360 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69  5Iter *pNew;.  i
16370 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16390 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
163a0 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72  = nSeg */..  for
163b0 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
163c0 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
163d0 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66  t*2);.  pNew = f
163e0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
163f0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
16400 73 35 49 74 65 72 29 20 2b 20 20 20 20 20 20 20  s5Iter) +       
16410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
16420 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  ew */.      size
16430 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20  of(Fts5SegIter) 
16440 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20  * (nSlot-1) +   
16450 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20  /* pNew->aSeg[] 
16460 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
16470 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e  Fts5CResult) * n
16480 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20  Slot         /* 
16490 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a  pNew->aFirst[] *
164a0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  /.  );.  if( pNe
164b0 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
164c0 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20  Seg = nSlot;.   
164d0 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
164e0 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
164f0 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
16500 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64  ;.    pNew->pInd
16510 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e 65 77  ex = p;.    pNew
16520 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
16530 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
16540 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72  ts_Noop;.  }.  r
16550 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73  eturn pNew;.}..s
16560 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
16570 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a  oslistCallback(.
16580 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
16590 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70  used, .  void *p
165a0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
165b0 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
165c0 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e  t nChunk.){.  UN
165d0 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
165e0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
165f0 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
16600 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
16610 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
16620 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46  afeAppendBlob((F
16630 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74  ts5Buffer*)pCont
16640 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ext, pChunk, nCh
16650 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70  unk);.  }.}..typ
16660 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
16670 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50  istCallbackCtx P
16680 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16690 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73  x;.struct Poslis
166a0 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20  tCallbackCtx {. 
166b0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
166c0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
166d0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
166e0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
166f0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
16700 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
16710 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
16720 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
16730 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74  n */.  int eStat
16740 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16750 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
16760 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ove */.};..typed
16770 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73  ef struct Poslis
16780 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73 6c  tOffsetsCtx Posl
16790 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a 73  istOffsetsCtx;.s
167a0 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66  truct PoslistOff
167b0 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73 35  setsCtx {.  Fts5
167c0 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
167d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
167e0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75  ppend to this bu
167f0 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ffer */.  Fts5Co
16800 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20  lset *pColset;  
16810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16820 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
16830 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
16840 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 69    int iRead;.  i
16850 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f  nt iWrite;.};../
16860 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20  *.** TODO: Make 
16870 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69  this more effici
16880 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent!.*/.static i
16890 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  nt fts5IndexCols
168a0 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73 65  etTest(Fts5Colse
168b0 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20  t *pColset, int 
168c0 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
168d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
168e0 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
168f0 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
16900 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f  t->aiCol[i]==iCo
16910 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
16920 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16940 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43  5PoslistOffsetsC
16950 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
16960 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a  ndex *pUnused, .
16970 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
16980 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
16990 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
169a0 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66  k.){.  PoslistOf
169b0 66 73 65 74 73 43 74 78 20 2a 70 43 74 78 20 3d  fsetsCtx *pCtx =
169c0 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73   (PoslistOffsets
169d0 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx*)pContext;. 
169e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
169f0 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  nused);.  assert
16a00 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
16a10 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
16a20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
16a30 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c  0;.    while( i<
16a40 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16a50 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
16a60 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
16a70 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c  nt32(&pChunk[i],
16a80 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 56   iVal);.      iV
16a90 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61  al += pCtx->iRea
16aa0 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43 74  d - 2;.      pCt
16ab0 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c 3b  x->iRead = iVal;
16ac0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49  .      if( fts5I
16ad0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
16ae0 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56  Ctx->pColset, iV
16af0 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  al) ){.        f
16b00 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
16b10 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e  endVarint(pCtx->
16b20 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d  pBuf, iVal + 2 -
16b30 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a   pCtx->iWrite);.
16b40 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69 57          pCtx->iW
16b50 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20  rite = iVal;.   
16b60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
16b70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16b80 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
16b90 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
16ba0 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 0a 20  ndex *pUnused,. 
16bb0 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
16bc0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
16bd0 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
16be0 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c  .){.  PoslistCal
16bf0 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20 3d  lbackCtx *pCtx =
16c00 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63   (PoslistCallbac
16c10 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  kCtx*)pContext;.
16c20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
16c30 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72  Unused);.  asser
16c40 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
16c50 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
16c60 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
16c70 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20 66 69  ch through to fi
16c80 6e 64 20 74 68 65 20 66 69 72 73 74 20 76 61 72  nd the first var
16c90 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65 20 31  int with value 1
16ca0 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a 20 20  . This is the.  
16cb0 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
16cc0 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68  e next columns h
16cd0 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  its. */.    int 
16ce0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
16cf0 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Start = 0;..    
16d00 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
16d10 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==2 ){.      int
16d20 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73   iCol;.      fts
16d30 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
16d40 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c  (pChunk, i, iCol
16d50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  );.      if( fts
16d60 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16d70 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
16d80 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iCol) ){.       
16d90 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
16da0 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  1;.        fts5B
16db0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
16dc0 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66  arint(pCtx->pBuf
16dd0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
16de0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  e{.        pCtx-
16df0 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20  >eState = 0;.   
16e00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16e10 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  do {.      while
16e20 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43  ( i<nChunk && pC
16e30 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b  hunk[i]!=0x01 ){
16e40 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
16e50 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30  pChunk[i] & 0x80
16e60 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) i++;.        
16e70 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
16e80 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
16e90 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ate ){.        f
16ea0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
16eb0 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42  endBlob(pCtx->pB
16ec0 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61  uf, &pChunk[iSta
16ed0 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a  rt], i-iStart);.
16ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16ef0 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20  ( i<nChunk ){.  
16f00 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
16f10 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
16f20 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   i;.        i++;
16f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
16f40 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16f50 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
16f60 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 2;.        }e
16f70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
16f80 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
16f90 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
16fa0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ol);.          p
16fb0 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 66 74  Ctx->eState = ft
16fc0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16fd0 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16fe0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
16ff0 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
17000 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
17010 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
17020 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
17030 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
17040 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
17050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17060 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  Start = i;.     
17070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
17090 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b  ile( i<nChunk );
170a0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
170b0 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
170c0 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rate(.  Fts5Inde
170d0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
170e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
170f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
17100 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17120 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20  Poslist of this 
17130 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f  iterator */.  vo
17140 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17160 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   Context pointer
17170 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c   for xChunk call
17180 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
17190 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64  *xChunk)(Fts5Ind
171a0 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73  ex*, void*, cons
171b0 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20  t u8*, int).){. 
171c0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67   int nRem = pSeg
171d0 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  ->nPos;         
171e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
171f0 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d  tes still to com
17200 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
17210 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38  *pData = 0;.  u8
17220 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67   *pChunk = &pSeg
17230 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
17240 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
17250 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49   int nChunk = MI
17260 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c  N(nRem, pSeg->pL
17270 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  eaf->szLeaf - pS
17280 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29  eg->iLeafOffset)
17290 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70  ;.  int pgno = p
172a0 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  Seg->iLeafPgno;.
172b0 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d    int pgnoSave =
172c0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
172d0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
172e0 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74 61 69  mwork with detai
172f0 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73 65 73  l=none databases
17300 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
17310 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
17320 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
17330 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 28  NONE );..  if( (
17340 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46 54  pSeg->flags & FT
17350 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
17360 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67  SE)==0 ){.    pg
17370 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b  noSave = pgno+1;
17380 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
17390 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28 70   ){.    xChunk(p
173a0 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20  , pCtx, pChunk, 
173b0 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65  nChunk);.    nRe
173c0 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20  m -= nChunk;.   
173d0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
173e0 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  (pData);.    if(
173f0 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20   nRem<=0 ){.    
17400 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
17410 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b  se{.      pgno++
17420 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
17430 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
17440 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
17450 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69  ID(pSeg->pSeg->i
17460 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20  Segid, pgno));. 
17470 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d       if( pData==
17480 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
17490 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61   pChunk = &pData
174a0 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43  ->p[4];.      nC
174b0 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
174c0 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
174d0 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   4);.      if( p
174e0 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b  gno==pgnoSave ){
174f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17500 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
17510 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
17520 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  Seg->pNextLeaf =
17530 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   pData;.        
17540 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  pData = 0;.     
17550 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
17560 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
17570 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
17580 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
17590 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29   entry (not EOF)
175a0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
175b0 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 70  on appends the p
175c0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
175d0 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
175e0 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75  t entry to.** bu
175f0 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f  ffer pBuf. It do
17600 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f  es not make a co
17610 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
17620 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20  on-list size.** 
17630 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
17640 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74 65   void fts5Segite
17650 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
17660 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
17670 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20  SegIter *pSeg,. 
17680 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
17690 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
176a0 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
176b0 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  ( 0==fts5BufferG
176c0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
176d0 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b  , pSeg->nPos) ){
176e0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
176f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
17700 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
17710 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42   pSeg, (void*)pB
17720 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43  uf, fts5PoslistC
17730 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65  allback);.    }e
17740 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
17750 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
17760 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
17770 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  FULL ){.        
17780 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
17790 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20  tx sCtx;.       
177a0 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75   sCtx.pBuf = pBu
177b0 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  f;.        sCtx.
177c0 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
177d0 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  t;.        sCtx.
177e0 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
177f0 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f  exColsetTest(pCo
17800 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lset, 0);.      
17810 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e 65    assert( sCtx.e
17820 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78  State==0 || sCtx
17830 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20  .eState==1 );.  
17840 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
17850 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
17860 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74  (void*)&sCtx, ft
17870 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
17880 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
17890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
178a0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
178b0 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d   sCtx;.        m
178c0 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
178d0 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
178e0 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66         sCtx.pBuf
178f0 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20   = pBuf;.       
17900 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
17910 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20  pColset;.       
17920 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
17930 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
17940 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73  *)&sCtx, fts5Pos
17950 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62  listOffsetsCallb
17960 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ack);.      }.  
17970 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17980 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65   IN/OUT paramete
17990 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74  r (*pa) points t
179a0 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  o a position lis
179b0 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  t n bytes in siz
179c0 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73  e. If.** the pos
179d0 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ition list conta
179e0 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
179f0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65  column iCol, the
17a00 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a  n (*pa) is set.*
17a10 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  * to point to th
17a20 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c  e sub-position-l
17a30 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c  ist for that col
17a40 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  umn and the numb
17a50 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69  er of.** bytes i
17a60 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f  n it returned. O
17a70 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  r, if the argume
17a80 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
17a90 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e   does not.** con
17aa0 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73  tain any entries
17ab0 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
17ac0 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
17ad0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
17ae0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20  dexExtractCol(. 
17af0 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20   const u8 **pa, 
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
17b20 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a  ter to poslist *
17b30 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 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 2f 2a 20 49 4e 3a 20 53 69 7a 65 20      /* IN: Size 
17b60 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79  of poslist in by
17b70 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  tes */.  int iCo
17b80 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
17b90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
17ba0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  mn to extract fr
17bb0 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b  om poslist */.){
17bc0 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
17bd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17be0 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62     /* Anything b
17bf0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
17c00 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f  0x01 is col 0 */
17c10 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d  .  const u8 *p =
17c20 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38   *pa;.  const u8
17c30 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20   *pEnd = &p[n]; 
17c40 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
17c50 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
17c60 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
17c70 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e  ..  while( iCol>
17c80 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
17c90 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  /* Advance point
17ca0 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f  er p until it po
17cb0 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20  ints to pEnd or 
17cc0 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61  an 0x01 byte tha
17cd0 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  t is.    ** not 
17ce0 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
17cf0 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  . Note that it i
17d00 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
17d10 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a 20 20  or a negative.  
17d20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65 6c    ** or extremel
17d30 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74 20 74  y large varint t
17d40 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61  o occur within a
17d50 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20 70 6f  n uncorrupted po
17d60 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c  sition .    ** l
17d70 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74  ist. So the last
17d80 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 76 61   byte of each va
17d90 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73 73 75  rint may be assu
17da0 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20 63 6c  med to have a cl
17db0 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38 30 20  ear.    ** 0x80 
17dc0 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  bit.  */.    whi
17dd0 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a  le( *p!=0x01 ){.
17de0 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b        while( *p+
17df0 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 20 20  + & 0x80 );.    
17e00 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 20    if( p>=pEnd ) 
17e10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
17e20 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20      *pa = p++;. 
17e30 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 2a 70     iCurrent = *p
17e40 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 75 72  ++;.    if( iCur
17e50 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b 0a 20  rent & 0x80 ){. 
17e60 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20 20       p--;.      
17e70 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
17e80 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74  nt32(p, iCurrent
17e90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
17ea0 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e  f( iCol!=iCurren
17eb0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
17ec0 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
17ed0 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70  ter p until it p
17ee0 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
17ef0 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68   an 0x01 byte th
17f00 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70  at is.  ** not p
17f10 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20  art of a varint 
17f20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45  */.  while( p<pE
17f30 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31 20 29  nd && *p!=0x01 )
17f40 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b  {.    while( *p+
17f50 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 7d 0a  + & 0x80 );.  }.
17f60 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a  .  return p - (*
17f70 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  pa);.}..static v
17f80 6f 69 64 20 66 74 73 35 49 6e 64 65 78 45 78 74  oid fts5IndexExt
17f90 72 61 63 74 43 6f 6c 73 65 74 28 0a 20 20 69 6e  ractColset(.  in
17fa0 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35 43 6f  t *pRc,.  Fts5Co
17fb0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
17fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
17fd0 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e  set to filter on
17fe0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
17ff0 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20  pPos, int nPos, 
18000 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
18010 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35  n list */.  Fts5
18020 42 75 66 66 65 72 20 2a 70 42 75 66 20 20 20 20  Buffer *pBuf    
18030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18040 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
18050 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
18060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18070 69 6e 74 20 69 3b 0a 20 20 20 20 66 74 73 35 42  int i;.    fts5B
18080 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b  ufferZero(pBuf);
18090 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
180a0 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69  pColset->nCol; i
180b0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
180c0 20 75 38 20 2a 70 53 75 62 20 3d 20 70 50 6f 73   u8 *pSub = pPos
180d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 75 62  ;.      int nSub
180e0 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74 72   = fts5IndexExtr
180f0 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50  actCol(&pSub, nP
18100 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43  os, pColset->aiC
18110 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  ol[i]);.      if
18120 28 20 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( nSub ){.      
18130 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
18140 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66  ndBlob(pRc, pBuf
18150 2c 20 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a 20  , nSub, pSub);. 
18160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75  .}../*.** xSetOu
18180 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75  tputs callback u
18190 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f  sed by detail=no
181a0 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  ne tables..*/.st
181b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
181c0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e  erSetOutputs_Non
181d0 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  e(Fts5Iter *pIte
181e0 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
181f0 70 53 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  pSeg){.  assert(
18200 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
18210 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
18220 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
18230 4e 45 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62  NE );.  pIter->b
18240 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
18250 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74  g->iRowid;.  pIt
18260 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18270 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d 0a 0a   pSeg->nPos;.}..
18280 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
18290 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
182a0 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 61  by detail=full a
182b0 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c 20 74 61  nd detail=col ta
182c0 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a 2a 2a 20  bles when no.** 
182d0 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 73 20 61  column filters a
182e0 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  re specified..*/
182f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18300 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18310 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35 49 74 65  Nocolset(Fts5Ite
18320 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65  r *pIter, Fts5Se
18330 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20  gIter *pSeg){.  
18340 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77  pIter->base.iRow
18350 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
18360 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  d;.  pIter->base
18370 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e  .nData = pSeg->n
18380 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Pos;..  assert( 
18390 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
183a0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
183b0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
183c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
183d0 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30  Iter->pColset==0
183e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d   );..  if( pSeg-
183f0 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
18400 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70  g->nPos<=pSeg->p
18410 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
18420 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20      /* All data 
18430 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  is stored on the
18440 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50   current page. P
18450 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70  opulate the outp
18460 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ut .    ** varia
18470 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e  bles to point in
18480 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
18490 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20  he page object. 
184a0 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  */.    pIter->ba
184b0 73 65 2e 70 44 61 74 61 20 3d 20 26 70 53 65 67  se.pData = &pSeg
184c0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
184d0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
184e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
184f0 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74 72  he data is distr
18500 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f 20  ibuted over two 
18510 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20 43  or more pages. C
18520 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  opy it into the.
18530 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72 2e      ** Fts5Iter.
18540 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61  poslist buffer a
18550 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  nd then set the 
18560 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 74  output pointer t
18570 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74  o point.    ** t
18580 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20 20  o this buffer.  
18590 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
185a0 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
185b0 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35  slist);.    fts5
185c0 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
185d0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53  Iter->pIndex, pS
185e0 65 67 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70  eg, 0, &pIter->p
185f0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
18600 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
18610 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18620 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
18630 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c  xSetOutputs call
18640 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 20 74  back used when t
18650 68 65 20 46 74 73 35 43 6f 6c 73 65 74 20 6f 62  he Fts5Colset ob
18660 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c 3d 3d 30  ject has nCol==0
18670 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67 61 69 6e   (match.** again
18680 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 61 74  st no columns at
18690 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63   all)..*/.static
186a0 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
186b0 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c  tOutputs_ZeroCol
186c0 73 65 74 28 46 74 73 35 49 74 65 72 20 2a 70 49  set(Fts5Iter *pI
186d0 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
186e0 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e 55 53 45   *pSeg){.  UNUSE
186f0 44 5f 50 41 52 41 4d 28 70 53 65 67 29 3b 0a 20  D_PARAM(pSeg);. 
18700 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
18710 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
18720 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
18730 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65  lback used by de
18740 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e 20 74 68  tail=col when th
18750 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ere is a column 
18760 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68  filter.** and th
18770 65 72 65 20 61 72 65 20 31 30 30 20 6f 72 20 6d  ere are 100 or m
18780 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c 73  ore columns. Als
18790 6f 20 63 61 6c 6c 65 64 20 61 73 20 61 20 66 61  o called as a fa
187a0 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20 66  llback from.** f
187b0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
187c0 73 5f 43 6f 6c 31 30 30 20 69 66 20 74 68 65 20  s_Col100 if the 
187d0 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73 70 61 6e  column-list span
187e0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
187f0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
18800 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
18810 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46 74 73 35  Outputs_Col(Fts5
18820 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
18830 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
18840 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
18850 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
18860 74 29 3b 0a 20 20 66 74 73 35 53 65 67 69 74 65  t);.  fts5Segite
18870 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
18880 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 49  pIndex, pSeg, pI
18890 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 26 70  ter->pColset, &p
188a0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
188b0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
188c0 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
188d0 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  wid;.  pIter->ba
188e0 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72  se.pData = pIter
188f0 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 70  ->poslist.p;.  p
18900 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
18910 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18920 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  t.n;.}../*.** xS
18930 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
18940 63 6b 20 75 73 65 64 20 77 68 65 6e 3a 20 0a 2a  ck used when: .*
18950 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61 69 6c 3d  *.**   * detail=
18960 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 72  col,.**   * ther
18970 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69  e is a column fi
18980 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  lter, and.**   *
18990 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   the table conta
189a0 69 6e 73 20 31 30 30 20 6f 72 20 66 65 77 65 72  ins 100 or fewer
189b0 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a 2a   columns. .**.**
189c0 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e 74 20   The last point 
189d0 69 73 20 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c  is to ensure all
189e0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   column numbers 
189f0 61 72 65 20 73 74 6f 72 65 64 20 61 73 20 0a 2a  are stored as .*
18a00 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 76 61  * single-byte va
18a10 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rints..*/.static
18a20 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
18a30 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 28  tOutputs_Col100(
18a40 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
18a50 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
18a60 65 67 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  eg){..  assert( 
18a70 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
18a80 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
18a90 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c  =FTS5_DETAIL_COL
18aa0 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73 65 72 74  UMNS );.  assert
18ab0 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
18ac0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d   );..  if( pSeg-
18ad0 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
18ae0 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e 70 4c  g->nPos>pSeg->pL
18af0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
18b00 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
18b10 74 70 75 74 73 5f 43 6f 6c 28 70 49 74 65 72 2c  tputs_Col(pIter,
18b20 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b   pSeg);.  }else{
18b30 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 28 75 38  .    u8 *a = (u8
18b40 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  *)&pSeg->pLeaf->
18b50 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  p[pSeg->iLeafOff
18b60 73 65 74 5d 3b 0a 20 20 20 20 75 38 20 2a 70 45  set];.    u8 *pE
18b70 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b 70 53 65  nd = (u8*)&a[pSe
18b80 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20 20 69  g->nPos]; .    i
18b90 6e 74 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20  nt iPrev = 0;.  
18ba0 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70    int *aiCol = p
18bb0 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61  Iter->pColset->a
18bc0 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 2a 61  iCol;.    int *a
18bd0 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69 43 6f 6c  iColEnd = &aiCol
18be0 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d  [pIter->pColset-
18bf0 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38 20  >nCol];..    u8 
18c00 2a 61 4f 75 74 20 3d 20 70 49 74 65 72 2d 3e 70  *aOut = pIter->p
18c10 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 69 6e  oslist.p;.    in
18c20 74 20 69 50 72 65 76 4f 75 74 20 3d 20 30 3b 0a  t iPrevOut = 0;.
18c30 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
18c40 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18c50 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 77 68 69  iRowid;..    whi
18c60 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20  le( a<pEnd ){.  
18c70 20 20 20 20 69 50 72 65 76 20 2b 3d 20 28 69 6e      iPrev += (in
18c80 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20 20  t)a++[0] - 2;.  
18c90 20 20 20 20 77 68 69 6c 65 28 20 2a 61 69 43 6f      while( *aiCo
18ca0 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20  l<iPrev ){.     
18cb0 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20     aiCol++;.    
18cc0 20 20 20 20 69 66 28 20 61 69 43 6f 6c 3d 3d 61      if( aiCol==a
18cd0 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74 6f 20 73  iColEnd ) goto s
18ce0 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75  etoutputs_col_ou
18cf0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
18d00 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d 69 50 72   if( *aiCol==iPr
18d10 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ev ){.        *a
18d20 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 28 69 50  Out++ = (u8)((iP
18d30 72 65 76 20 2d 20 69 50 72 65 76 4f 75 74 29 20  rev - iPrevOut) 
18d40 2b 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69 50  + 2);.        iP
18d50 72 65 76 4f 75 74 20 3d 20 69 50 72 65 76 3b 0a  revOut = iPrev;.
18d60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 73        }.    }..s
18d70 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75  etoutputs_col_ou
18d80 74 3a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  t:.    pIter->ba
18d90 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72  se.pData = pIter
18da0 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
18db0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
18dc0 74 61 20 3d 20 61 4f 75 74 20 2d 20 70 49 74 65  ta = aOut - pIte
18dd0 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18de0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  }.}../*.** xSetO
18df0 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
18e00 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66  used by detail=f
18e10 75 6c 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69  ull when there i
18e20 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65  s a column filte
18e30 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
18e40 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
18e50 70 75 74 73 5f 46 75 6c 6c 28 46 74 73 35 49 74  puts_Full(Fts5It
18e60 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
18e70 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
18e80 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
18e90 6c 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 70 43  lset = pIter->pC
18ea0 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e  olset;.  pIter->
18eb0 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
18ec0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 61  eg->iRowid;..  a
18ed0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
18ee0 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  ndex->pConfig->e
18ef0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
18f00 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20 61 73  AIL_FULL );.  as
18f10 73 65 72 74 28 20 70 43 6f 6c 73 65 74 20 29 3b  sert( pColset );
18f20 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c  ..  if( pSeg->iL
18f30 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e  eafOffset+pSeg->
18f40 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61  nPos<=pSeg->pLea
18f50 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
18f60 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69 73 20   /* All data is 
18f70 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
18f80 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f 70 75  rrent page. Popu
18f90 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74 20  late the output 
18fa0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
18fb0 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20  s to point into 
18fc0 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
18fd0 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  page object. */.
18fe0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20      const u8 *a 
18ff0 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  = &pSeg->pLeaf->
19000 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  p[pSeg->iLeafOff
19010 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  set];.    if( pC
19020 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29  olset->nCol==1 )
19030 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  {.      pIter->b
19040 61 73 65 2e 6e 44 61 74 61 20 3d 20 66 74 73 35  ase.nData = fts5
19050 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
19060 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 70  &a, pSeg->nPos,p
19070 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d  Colset->aiCol[0]
19080 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
19090 62 61 73 65 2e 70 44 61 74 61 20 3d 20 61 3b 0a  base.pData = a;.
190a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
190b0 20 69 6e 74 20 2a 70 52 63 20 3d 20 26 70 49 74   int *pRc = &pIt
190c0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3b 0a  er->pIndex->rc;.
190d0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
190e0 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
190f0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73  list);.      fts
19100 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
19110 73 65 74 28 70 52 63 2c 20 70 43 6f 6c 73 65 74  set(pRc, pColset
19120 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  , a, pSeg->nPos,
19130 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
19140 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
19150 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
19160 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
19170 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65       pIter->base
19180 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .nData = pIter->
19190 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d  poslist.n;.    }
191a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
191b0 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73   The data is dis
191c0 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77  tributed over tw
191d0 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e  o or more pages.
191e0 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68   Copy it into th
191f0 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65  e.    ** Fts5Ite
19200 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72  r.poslist buffer
19210 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68   and then set th
19220 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72  e output pointer
19230 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a   to point.    **
19240 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e   to this buffer.
19250 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66    */.    fts5Buf
19260 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
19270 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74  poslist);.    ft
19280 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
19290 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
192a0 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 26  pSeg, pColset, &
192b0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
192c0 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
192d0 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
192e0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70  poslist.p;.    p
192f0 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
19300 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
19310 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  t.n;.  }.}..stat
19320 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
19330 53 65 74 4f 75 74 70 75 74 43 62 28 69 6e 74 20  SetOutputCb(int 
19340 2a 70 52 63 2c 20 46 74 73 35 49 74 65 72 20 2a  *pRc, Fts5Iter *
19350 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 2a 70  pIter){.  if( *p
19360 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
19370 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
19380 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49 74 65 72  *pConfig = pIter
19390 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69  ->pIndex->pConfi
193a0 67 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  g;.    if( pConf
193b0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
193c0 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
193d0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
193e0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
193f0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
19400 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  one;.    }..    
19410 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
19420 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20  pColset==0 ){.  
19430 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
19440 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
19450 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f  rSetOutputs_Noco
19460 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  lset;.    }..   
19470 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d   else if( pIter-
19480 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d  >pColset->nCol==
19490 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  0 ){.      pIter
194a0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
194b0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
194c0 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b 0a 20  ts_ZeroColset;. 
194d0 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69     }..    else i
194e0 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  f( pConfig->eDet
194f0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
19500 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  _FULL ){.      p
19510 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
19520 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
19530 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20  utputs_Full;.   
19540 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   }..    else{.  
19550 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e      assert( pCon
19560 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
19570 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e  S5_DETAIL_COLUMN
19580 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  S );.      if( p
19590 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30  Config->nCol<=10
195a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  0 ){.        pIt
195b0 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
195c0 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
195d0 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20  puts_Col100;.   
195e0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
195f0 42 75 66 66 65 72 53 69 7a 65 28 70 52 63 2c 20  BufferSize(pRc, 
19600 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c  &pIter->poslist,
19610 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b   pConfig->nCol);
19620 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19630 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
19640 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
19650 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
19660 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
19670 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  .  }.}.../*.** A
19680 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74  llocate a new Ft
19690 73 35 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a  s5Iter object..*
196a0 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a  *.** The new obj
196b0 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ect will be used
196c0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
196d0 75 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75  ugh data in stru
196e0 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a  cture pStruct..*
196f0 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d  * If iLevel is -
19700 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74  ve, then all dat
19710 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74  a in all segment
19720 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c  s is merged. Or,
19730 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73   if iLevel.** is
19740 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72   zero or greater
19750 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  , data from the 
19760 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73  first nSegment s
19770 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
19780 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65   iLevel.** is me
19790 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rged..**.** The 
197a0 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c  iterator initial
197b0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
197c0 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69   first term/rowi
197d0 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a  d entry in the .
197e0 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61  ** iterated data
197f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19800 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
19810 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  w(.  Fts5Index *
19820 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
19830 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
19840 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
19850 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
19860 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
19870 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ct,         /* S
19880 74 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63  tructure of spec
19890 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ific index */.  
198a0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198c0 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  /* FTS5INDEX_QUE
198d0 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  RY_XXX flags */.
198e0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
198f0 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
19900 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66    /* Colset to f
19910 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c  ilter on (or NUL
19920 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  L) */.  const u8
19930 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
19940 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
19950 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e  to seek to (or N
19960 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20  ULL/0) */.  int 
19970 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
19980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
19990 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20  evel to iterate 
199a0 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a  (-1 for all) */.
199b0 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20    int nSegment, 
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
199e0 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
199f0 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a   (iLevel>=0) */.
19a00 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f    Fts5Iter **ppO
19a10 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
19a20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20    /* New object 
19a30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  */.){.  int nSeg
19a40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19a50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19a60 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65  r of segment-ite
19a70 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  rs in use */.  i
19a80 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20  nt iIter = 0;   
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19aa0 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b  * */.  int iSeg;
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
19ad0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
19ae0 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  h segments */.  
19af0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
19b00 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35  el *pLvl;.  Fts5
19b10 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61  Iter *pNew;..  a
19b20 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30  ssert( (pTerm==0
19b30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c   && nTerm==0) ||
19b40 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20   iLevel<0 );..  
19b50 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
19b60 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75  e for the new mu
19b70 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72  lti-seg-iterator
19b80 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63  . */.  if( p->rc
19b90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19ba0 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20     if( iLevel<0 
19bb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19bc0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
19bd0 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72  nt==fts5Structur
19be0 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70  eCountSegments(p
19bf0 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20  Struct) );.     
19c00 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d   nSeg = pStruct-
19c10 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20  >nSegment;.     
19c20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61   nSeg += (p->pHa
19c30 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  sh ? 1 : 0);.   
19c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
19c50 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74  eg = MIN(pStruct
19c60 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d  ->aLevel[iLevel]
19c70 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29  .nSeg, nSegment)
19c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
19c90 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74  pOut = pNew = ft
19ca0 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
19cb0 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28  (p, nSeg);.  if(
19cc0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
19cd0 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20  n;.  pNew->bRev 
19ce0 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46  = (0!=(flags & F
19cf0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
19d00 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62  ESC));.  pNew->b
19d10 53 6b 69 70 45 6d 70 74 79 20 3d 20 28 30 21 3d  SkipEmpty = (0!=
19d20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
19d30 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50  EX_QUERY_SKIPEMP
19d40 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  TY));.  pNew->pS
19d50 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
19d60 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74  .  pNew->pColset
19d70 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 66 74   = pColset;.  ft
19d80 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70  s5StructureRef(p
19d90 53 74 72 75 63 74 29 3b 0a 20 20 69 66 28 20 28  Struct);.  if( (
19da0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
19db0 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54  X_QUERY_NOOUTPUT
19dc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  )==0 ){.    fts5
19dd0 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
19de0 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20  &p->rc, pNew);. 
19df0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
19e00 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  ize each of the 
19e10 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e  component segmen
19e20 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a  t iterators. */.
19e30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19e50 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20  ( iLevel<0 ){.  
19e60 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
19e70 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26  eLevel *pEnd = &
19e80 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
19e90 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
19ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
19eb0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
19ec0 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74  /* Add a segment
19ed0 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68   iterator for th
19ee0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
19ef0 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74  ts of the hash t
19f00 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  able. */.       
19f10 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
19f20 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
19f30 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20  g[iIter++];.    
19f40 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48      fts5SegIterH
19f50 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d  ashInit(p, pTerm
19f60 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
19f70 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
19f80 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26        for(pLvl=&
19f90 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
19fa0 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70  0]; pLvl<pEnd; p
19fb0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
19fc0 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e  for(iSeg=pLvl->n
19fd0 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20  Seg-1; iSeg>=0; 
19fe0 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20  iSeg--){.       
19ff0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1a000 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
1a010 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
1a020 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ];.          Fts
1a030 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
1a040 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
1a050 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
1a060 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
1a070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1a080 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
1a090 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20   pSeg, pIter);. 
1a0a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1a0c0 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
1a0d0 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  p, pTerm, nTerm,
1a0e0 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49   flags, pSeg, pI
1a0f0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
1a100 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1a110 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1a120 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74       pLvl = &pSt
1a130 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
1a140 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  vel];.      for(
1a150 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65  iSeg=nSeg-1; iSe
1a160 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
1a170 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a180 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d  erInit(p, &pLvl-
1a190 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e  >aSeg[iSeg], &pN
1a1a0 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
1a1b0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1a1c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 49  }.    assert( iI
1a1d0 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d  ter==nSeg );.  }
1a1e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
1a1f0 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ove was successf
1a200 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  ul, each compone
1a210 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77  nt iterators now
1a220 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f   points .  ** to
1a230 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1a240 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e   in its segment.
1a250 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
1a260 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20  itialize the .  
1a270 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
1a280 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  y. Or, if an err
1a290 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
1a2a0 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74   free the iterat
1a2b0 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61  or.  ** object a
1a2c0 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  nd set the outpu
1a2d0 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
1a2e0 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LL.  */.  if( p-
1a2f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a300 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d  {.    for(iIter=
1a310 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49  pNew->nSeg-1; iI
1a320 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b  ter>0; iIter--){
1a330 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  .      int iEq;.
1a340 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d        if( (iEq =
1a350 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
1a360 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49  Compare(pNew, iI
1a370 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ter)) ){.       
1a380 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1a390 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  eg = &pNew->aSeg
1a3a0 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69  [iEq];.        i
1a3b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a3c0 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65 78  _OK ) pSeg->xNex
1a3d0 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20  t(p, pSeg, 0);. 
1a3e0 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
1a3f0 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
1a400 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72  pNew, iEq, iIter
1a410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a420 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
1a430 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a  erSetEof(pNew);.
1a440 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75      fts5AssertMu
1a450 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20  ltiIterSetup(p, 
1a460 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
1a470 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79  pNew->bSkipEmpty
1a480 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
1a490 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77  rIsEmpty(p, pNew
1a4a0 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  ) ){.      fts5M
1a4b0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1a4c0 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pNew, 0, 0);.   
1a4d0 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77 2d   }else if( pNew-
1a4e0 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b  >base.bEof==0 ){
1a4f0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
1a500 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77  er *pSeg = &pNew
1a510 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69  ->aSeg[pNew->aFi
1a520 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a  rst[1].iFirst];.
1a530 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74        pNew->xSet
1a540 4f 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70 53  Outputs(pNew, pS
1a550 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  eg);.    }..  }e
1a560 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
1a570 74 69 49 74 65 72 46 72 65 65 28 70 4e 65 77 29  tiIterFree(pNew)
1a580 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
1a590 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1a5a0 72 65 61 74 65 20 61 6e 20 46 74 73 35 49 74 65  reate an Fts5Ite
1a5b0 72 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20  r that iterates 
1a5c0 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c  through the docl
1a5d0 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20  ist provided.** 
1a5e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1a5f0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1a600 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
1a610 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35  IterNew2(.  Fts5
1a620 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1a630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a640 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
1a650 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
1a660 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
1a670 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
1a680 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f     /* Doclist to
1a690 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1a6a0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1a6d0 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  r descending row
1a6e0 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74  id order */.  Ft
1a6f0 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  s5Iter **ppOut  
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a710 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29   New object */.)
1a720 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e  {.  Fts5Iter *pN
1a730 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73  ew;.  pNew = fts
1a740 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
1a750 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65  p, 2);.  if( pNe
1a760 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  w ){.    Fts5Seg
1a770 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
1a780 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20  New->aSeg[1];.. 
1a790 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
1a7a0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
1a7b0 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
1a7c0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20  pData->szLeaf>0 
1a7d0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
1a7e0 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  pLeaf = pData;. 
1a7f0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
1a800 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
1a810 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70  tVarint(pData->p
1a820 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
1a830 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70  iRowid);.      p
1a840 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
1a850 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b  ist = pData->nn;
1a860 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69  .      pNew->aFi
1a870 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20  rst[1].iFirst = 
1a880 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65  1;.      if( bDe
1a890 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  sc ){.        pN
1a8a0 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20  ew->bRev = 1;.  
1a8b0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
1a8c0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
1a8d0 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
1a8e0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
1a8f0 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
1a900 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
1a910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1a920 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
1a930 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
1a940 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74      }.      pDat
1a950 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
1a960 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61  {.      pNew->ba
1a970 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  se.bEof = 1;.   
1a980 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49 74   }.    fts5SegIt
1a990 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74  erSetNext(p, pIt
1a9a0 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74  er);..    *ppOut
1a9b0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
1a9c0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1a9d0 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
1a9e0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1a9f0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
1aa00 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20  at EOF or if an 
1aa10 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
1aa20 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74  ed. .** False ot
1aa30 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1aa40 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
1aa50 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
1aa60 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a  x *p, Fts5Iter *
1aa70 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
1aa80 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c  ( p->rc .      |
1aa90 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  | (pIter->aSeg[ 
1aaa0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1aab0 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d  .iFirst ].pLeaf=
1aac0 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65  =0)==pIter->base
1aad0 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65  .bEof .  );.  re
1aae0 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
1aaf0 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29  Iter->base.bEof)
1ab00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ab10 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  n the rowid of t
1ab20 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1ab30 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65  e iterator curre
1ab40 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74  ntly points.** t
1ab50 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74  o. If the iterat
1ab60 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
1ab70 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1ab80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
1ab90 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65  e.** results are
1aba0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
1abb0 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75  tatic i64 fts5Mu
1abc0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73  ltiIterRowid(Fts
1abd0 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
1abe0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
1abf0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1ac00 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
1ac10 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72  pLeaf );.  retur
1ac20 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  n pIter->aSeg[ p
1ac30 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
1ac40 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b  iFirst ].iRowid;
1ac50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1ac60 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
1ac70 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74  he next entry at
1ac80 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d   or following iM
1ac90 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
1aca0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
1acb0 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
1acc0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1acd0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
1ace0 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b  .  i64 iMatch.){
1acf0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
1ad00 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
1ad10 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1ad20 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31  Next(p, pIter, 1
1ad30 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69  , iMatch);.    i
1ad40 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
1ad50 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20  Eof(p, pIter) ) 
1ad60 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69  break;.    iRowi
1ad70 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
1ad80 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
1ad90 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
1ada0 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e  ev==0 && iRowid>
1adb0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
1adc0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1add0 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69  bRev!=0 && iRowi
1ade0 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
1adf0 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
1ae00 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1ae10 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1ae20 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
1ae30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ae40 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74   the .** entry t
1ae50 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
1ae60 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1ae70 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
1ae80 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75  const u8 *fts5Mu
1ae90 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35  ltiIterTerm(Fts5
1aea0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
1aeb0 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
1aec0 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
1aed0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1aee0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1aef0 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65  ];.  *pn = p->te
1af00 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  rm.n;.  return p
1af10 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a  ->term.p;.}../*.
1af20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1af30 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72  w segment-id for
1af40 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
1af50 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20  Struct. The new 
1af60 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75  segment.** id mu
1af70 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  st be between 1 
1af80 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73  and 65335 inclus
1af90 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f  ive, and must no
1afa0 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a  t be used by .**
1afb0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65   any currently e
1afc0 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e  xisting segment.
1afd0 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65   If a free segme
1afe0 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20  nt id cannot be 
1aff0 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
1b000 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  _FULL is returne
1b010 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
1b020 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
1b030 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1b040 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1b050 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65  -op. 0 is .** re
1b060 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
1b070 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1b080 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53  nt fts5AllocateS
1b090 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  egid(Fts5Index *
1b0a0 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  p, Fts5Structure
1b0b0 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
1b0c0 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20  t iSegid = 0;.. 
1b0d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b0e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1b0f0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1b100 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  nt>=FTS5_MAX_SEG
1b110 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d  MENT ){.      p-
1b120 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c  >rc = SQLITE_FUL
1b130 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1b140 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41 58 5f      /* FTS5_MAX_
1b150 53 45 47 4d 45 4e 54 20 69 73 20 63 75 72 72 65  SEGMENT is curre
1b160 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 61 73 20  ntly defined as 
1b170 32 30 30 30 2e 20 53 6f 20 74 68 65 20 66 6f 6c  2000. So the fol
1b180 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
1b190 61 72 72 61 79 20 69 73 20 36 33 20 65 6c 65 6d  array is 63 elem
1b1a0 65 6e 74 73 2c 20 6f 72 20 32 35 32 20 62 79 74  ents, or 252 byt
1b1b0 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f  es, in size.  */
1b1c0 0a 20 20 20 20 20 20 75 33 32 20 61 55 73 65 64  .      u32 aUsed
1b1d0 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  [(FTS5_MAX_SEGME
1b1e0 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a 20 20  NT+31) / 32];.  
1b1f0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
1b200 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  eg;.      int i;
1b210 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b  .      u32 mask;
1b220 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 55  .      memset(aU
1b230 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  sed, 0, sizeof(a
1b240 55 73 65 64 29 29 3b 0a 20 20 20 20 20 20 66 6f  Used));.      fo
1b250 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1b260 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1b270 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1b280 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1b290 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1b2a0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1b2b0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1b2c0 20 69 6e 74 20 69 49 64 20 3d 20 70 53 74 72 75   int iId = pStru
1b2d0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b2e0 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  .aSeg[iSeg].iSeg
1b2f0 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  id;.          if
1b300 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41 58 5f  ( iId<=FTS5_MAX_
1b310 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20  SEGMENT ){.     
1b320 20 20 20 20 20 20 20 61 55 73 65 64 5b 28 69 49         aUsed[(iI
1b330 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20 31 20  d-1) / 32] |= 1 
1b340 3c 3c 20 28 28 69 49 64 2d 31 29 20 25 20 33 32  << ((iId-1) % 32
1b350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b370 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
1b380 20 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46   aUsed[i]==0xFFF
1b390 46 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20  FFFFF; i++);.   
1b3a0 20 20 20 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b     mask = aUsed[
1b3b0 69 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  i];.      for(iS
1b3c0 65 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28  egid=0; mask & (
1b3d0 31 20 3c 3c 20 69 53 65 67 69 64 29 3b 20 69 53  1 << iSegid); iS
1b3e0 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69  egid++);.      i
1b3f0 53 65 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33  Segid += 1 + i*3
1b400 32 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  2;..#ifdef SQLIT
1b410 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f  E_DEBUG.      fo
1b420 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1b430 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1b440 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1b450 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1b460 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1b470 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1b480 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1b490 20 61 73 73 65 72 74 28 20 69 53 65 67 69 64 21   assert( iSegid!
1b4a0 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  =pStruct->aLevel
1b4b0 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1b4c0 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ].iSegid );.    
1b4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b4e0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 65 67      assert( iSeg
1b4f0 69 64 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d  id>0 && iSegid<=
1b500 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54  FTS5_MAX_SEGMENT
1b510 20 29 3b 0a 0a 20 20 20 20 20 20 7b 0a 20 20 20   );..      {.   
1b520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
1b530 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d 20  t *pIdxSelect = 
1b540 66 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d  fts5IdxSelectStm
1b550 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t(p);.        if
1b560 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b580 75 38 20 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b 30  u8 aBlob[2] = {0
1b590 78 66 66 2c 20 30 78 66 66 7d 3b 0a 20 20 20 20  xff, 0xff};.    
1b5a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1b5b0 6e 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63  nd_int(pIdxSelec
1b5c0 74 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20  t, 1, iSegid);. 
1b5d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b5e0 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53  _bind_blob(pIdxS
1b5f0 65 6c 65 63 74 2c 20 32 2c 20 61 42 6c 6f 62 2c  elect, 2, aBlob,
1b600 20 32 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   2, SQLITE_STATI
1b610 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  C);.          as
1b620 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74  sert( sqlite3_st
1b630 65 70 28 70 49 64 78 53 65 6c 65 63 74 29 21 3d  ep(pIdxSelect)!=
1b640 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20  SQLITE_ROW );.  
1b650 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1b660 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49  sqlite3_reset(pI
1b670 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  dxSelect);.     
1b680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1b690 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
1b6a0 20 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a   return iSegid;.
1b6b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
1b6c0 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e   all data curren
1b6d0 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68  tly cached in th
1b6e0 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a  e hash-tables..*
1b6f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1b700 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
1b710 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ta(Fts5Index *p)
1b720 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
1b730 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  Hash || p->nPend
1b740 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  ingData==0 );.  
1b750 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a  if( p->pHash ){.
1b760 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1b770 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73  ashClear(p->pHas
1b780 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64  h);.    p->nPend
1b790 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ingData = 0;.  }
1b7a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b7b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b7c0 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65   prefix, in byte
1b7d0 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 0a  s, that buffer .
1b7e0 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68  ** (pNew/<length
1b7f0 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72 65  -unknown>) share
1b800 73 20 77 69 74 68 20 62 75 66 66 65 72 20 28 70  s with buffer (p
1b810 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a  Old/nOld)..**.**
1b820 20 42 75 66 66 65 72 20 28 70 4e 65 77 2f 3c 6c   Buffer (pNew/<l
1b830 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20  ength-unknown>) 
1b840 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1b850 20 62 65 20 67 72 65 61 74 65 72 20 0a 2a 2a 20   be greater .** 
1b860 74 68 61 6e 20 62 75 66 66 65 72 20 28 70 4f 6c  than buffer (pOl
1b870 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74  d/nOld)..*/.stat
1b880 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69  ic int fts5Prefi
1b890 78 43 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e 4f  xCompress(int nO
1b8a0 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f  ld, const u8 *pO
1b8b0 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e  ld, const u8 *pN
1b8c0 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ew){.  int i;.  
1b8d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
1b8e0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
1b8f0 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20  Old[i]!=pNew[i] 
1b900 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
1b910 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74  eturn i;.}..stat
1b920 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1b930 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46  eDlidxClear(.  F
1b940 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1b950 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1b960 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  Writer,.  int bF
1b970 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20  lush            
1b980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1b990 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64  true, write dlid
1b9a0 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a  x to disk */.){.
1b9b0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1b9c0 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20  t( bFlush==0 || 
1b9d0 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  (pWriter->nDlidx
1b9e0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  >0 && pWriter->a
1b9f0 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
1ba00 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
1ba10 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
1ba20 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  x; i++){.    Fts
1ba30 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
1ba40 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
1ba50 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
1ba60 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
1ba70 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  n==0 ) break;.  
1ba80 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a    if( bFlush ){.
1ba90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
1baa0 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b  lidx->pgno!=0 );
1bab0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
1bac0 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
1bad0 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
1bae0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1baf0 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
1bb00 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
1bb10 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
1bb20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
1bb30 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
1bb40 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1bb50 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e  erZero(&pDlidx->
1bb60 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  buf);.    pDlidx
1bb70 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
1bb80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1bb90 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d  row the pWriter-
1bba0 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20  >aDlidx[] array 
1bbb0 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c  to at least nLvl
1bbc0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a   elements in siz
1bbd0 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72  e..** Any new ar
1bbe0 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ray elements are
1bbf0 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72   zeroed before r
1bc00 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1bc10 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74  tic int fts5Writ
1bc20 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74  eDlidxGrow(.  Ft
1bc30 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
1bc40 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1bc50 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c  iter,.  int nLvl
1bc60 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
1bc70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c  =SQLITE_OK && nL
1bc80 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c  vl>=pWriter->nDl
1bc90 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
1bca0 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69  lidxWriter *aDli
1bcb0 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57  dx = (Fts5DlidxW
1bcc0 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  riter*)sqlite3_r
1bcd0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
1bce0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c  pWriter->aDlidx,
1bcf0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
1bd00 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a  xWriter) * nLvl.
1bd10 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
1bd20 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Dlidx==0 ){.    
1bd30 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1bd40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1bd50 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  e{.      int nBy
1bd60 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1bd70 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28  DlidxWriter) * (
1bd80 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e  nLvl - pWriter->
1bd90 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d  nDlidx);.      m
1bda0 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57  emset(&aDlidx[pW
1bdb0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20  riter->nDlidx], 
1bdc0 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
1bdd0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1bde0 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20   = aDlidx;.     
1bdf0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
1be00 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20   = nLvl;.    }. 
1be10 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
1be20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
1be30 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
1be40 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c  st-index accumul
1be50 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72  ating in pWriter
1be60 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61  ->aDlidx[] is la
1be70 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66  rge.** enough, f
1be80 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20  lush it to disk 
1be90 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74  and return 1. Ot
1bea0 68 65 72 77 69 73 65 20 64 69 73 63 61 72 64 20  herwise discard 
1beb0 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  it and return.**
1bec0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
1bed0 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c   int fts5WriteFl
1bee0 75 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64  ushDlidx(Fts5Ind
1bef0 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
1bf00 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
1bf10 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b    int bFlag = 0;
1bf20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1bf30 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c  were FTS5_MIN_DL
1bf40 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65  IDX_SIZE or more
1bf50 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65   empty leaf page
1bf60 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  s written.  ** t
1bf70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
1bf80 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 64  also write the d
1bf90 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20  oclist-index to 
1bfa0 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20  disk.  */.  if( 
1bfb0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1bfc0 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57  0].buf.n>0 && pW
1bfd0 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
1bfe0 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
1bff0 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20  ZE ){.    bFlag 
1c000 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57  = 1;.  }.  fts5W
1c010 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70  riteDlidxClear(p
1c020 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67  , pWriter, bFlag
1c030 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  );.  pWriter->nE
1c040 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  mpty = 0;.  retu
1c050 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a  rn bFlag;.}../*.
1c060 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c070 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
1c080 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ver processing o
1c090 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  f the doclist fo
1c0a0 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74  r the .** last t
1c0b0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  erm on leaf page
1c0c0 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61   (pWriter->iBtPa
1c0d0 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64  ge) is completed
1c0e0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63  . .**.** The doc
1c0f0 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74  list-index for t
1c100 68 61 74 20 74 65 72 6d 20 69 73 20 63 75 72 72  hat term is curr
1c110 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d  ently stored in-
1c120 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68  memory within th
1c130 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74  e.** Fts5SegWrit
1c140 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  er.aDlidx[] arra
1c150 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72 67  y. If it is larg
1c160 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66  e enough, this f
1c170 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65  unction.** write
1c180 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b  s it out to disk
1c190 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74  . Or, if it is t
1c1a0 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68  oo small to both
1c1b0 65 72 20 77 69 74 68 2c 20 64 69 73 63 61 72 64  er with, discard
1c1c0 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46  s.** it..**.** F
1c1d0 74 73 35 53 65 67 57 72 69 74 65 72 2e 62 74 74  ts5SegWriter.btt
1c1e0 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  erm currently co
1c1f0 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
1c200 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42   term on page iB
1c210 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
1c220 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
1c230 6c 75 73 68 42 74 72 65 65 28 46 74 73 35 49 6e  lushBtree(Fts5In
1c240 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1c250 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1c260 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20  .  int bFlag;.. 
1c270 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1c280 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72  ->iBtPage || pWr
1c290 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20  iter->nEmpty==0 
1c2a0 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  );.  if( pWriter
1c2b0 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72  ->iBtPage==0 ) r
1c2c0 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d  eturn;.  bFlag =
1c2d0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44   fts5WriteFlushD
1c2e0 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65 72 29  lidx(p, pWriter)
1c2f0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
1c300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1c320 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   (pWriter->btter
1c330 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61  m.n>0?(const cha
1c340 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65  r*)pWriter->btte
1c350 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a  rm.p:"");.    /*
1c360 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   The following w
1c370 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20  as already done 
1c380 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  in fts5WriteInit
1c390 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71  (): */.    /* sq
1c3a0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c3b0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1c3c0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1c3d0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1c3e0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
1c3f0 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c  IdxWriter, 2, z,
1c400 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d   pWriter->btterm
1c410 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  .n, SQLITE_STATI
1c420 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
1c430 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49  bind_int64(p->pI
1c440 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c  dxWriter, 3, bFl
1c450 61 67 20 2b 20 28 28 69 36 34 29 70 57 72 69 74  ag + ((i64)pWrit
1c460 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29  er->iBtPage<<1))
1c470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
1c480 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ep(p->pIdxWriter
1c490 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  );.    p->rc = s
1c4a0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
1c4b0 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 7d  pIdxWriter);.  }
1c4c0 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
1c4d0 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  age = 0;.}../*.*
1c4e0 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
1c4f0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c   once for each l
1c500 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
1c510 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20 63  the first that c
1c520 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65  ontains.** at le
1c530 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72  ast one term. Ar
1c540 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54  gument (nTerm/pT
1c550 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69  erm) is the spli
1c560 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74  t-key - a term t
1c570 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  hat.** is larger
1c580 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20   than all terms 
1c590 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69  written to earli
1c5a0 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65  er leaves, and e
1c5b0 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d  qual to or.** sm
1c5c0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66  aller than the f
1c5d0 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  irst term on the
1c5e0 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a   new leaf..**.**
1c5f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c600 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1c610 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
1c620 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61  s5Index.rc. If a
1c630 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61  n error.** has a
1c640 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
1c650 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1c660 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
1c670 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c680 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c690 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a  WriteBtreeTerm(.
1c6a0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1c6d0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1c6e0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1c6f0 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
1c700 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1c710 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  /.  int nTerm, c
1c720 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20  onst u8 *pTerm  
1c730 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72      /* First ter
1c740 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f  m on new page */
1c750 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46  .){.  fts5WriteF
1c760 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72  lushBtree(p, pWr
1c770 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  iter);.  fts5Buf
1c780 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1c790 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c  pWriter->btterm,
1c7a0 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
1c7b0 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61    pWriter->iBtPa
1c7c0 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72  ge = pWriter->wr
1c7d0 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iter.pgno;.}../*
1c7e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c7f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
1c800 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66   flushing a leaf
1c810 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1c820 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20  ins no.** terms 
1c830 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a  at all to disk..
1c840 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c850 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
1c860 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1c870 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1c880 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1c890 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1c8a0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1c8b0 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20   *pWriter       
1c8c0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1c8d0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49  ect */.){.  /* I
1c8e0 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
1c8f0 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65  rowids on the le
1c900 61 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61  af page either a
1c910 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  nd the doclist-i
1c920 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c  ndex.  ** has al
1c930 72 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74  ready been start
1c940 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78  ed, append an 0x
1c950 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20  00 byte to it.  
1c960 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
1c970 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1c980 61 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e  age && pWriter->
1c990 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
1c9a0 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  0 ){.    Fts5Dli
1c9b0 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
1c9c0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1c9d0 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  idx[0];.    asse
1c9e0 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  rt( pDlidx->bPre
1c9f0 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71  vValid );.    sq
1ca00 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1ca10 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1ca20 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1ca30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1ca40 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e  Increment the "n
1ca50 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74  umber of sequent
1ca60 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f  ial leaves witho
1ca70 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74  ut a term" count
1ca80 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  er. */.  pWriter
1ca90 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73  ->nEmpty++;.}..s
1caa0 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c  tatic i64 fts5Dl
1cab0 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52  idxExtractFirstR
1cac0 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20  owid(Fts5Buffer 
1cad0 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52  *pBuf){.  i64 iR
1cae0 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66  owid;.  int iOff
1caf0 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20  ;..  iOff = 1 + 
1cb00 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
1cb10 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a  Buf->p[1], (u64*
1cb20 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73  )&iRowid);.  fts
1cb30 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
1cb40 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
1cb50 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74  )&iRowid);.  ret
1cb60 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  urn iRowid;.}../
1cb70 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69  *.** Rowid iRowi
1cb80 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  d has just been 
1cb90 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1cba0 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
1cbb0 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20  e. It is the.** 
1cbc0 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67  first on the pag
1cbd0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1cbe0 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72   appends an appr
1cbf0 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f  opriate entry to
1cc00 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1cc10 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
1cc20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1cc30 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
1cc40 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
1cc50 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1cc60 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1cc70 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
1cc80 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
1cc90 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  Done = 0;..  for
1cca0 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
1ccb0 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d  ITE_OK && bDone=
1ccc0 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  =0; i++){.    i6
1ccd0 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35  4 iVal;.    Fts5
1cce0 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
1ccf0 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1cd00 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20  aDlidx[i];..    
1cd10 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
1cd20 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
1cd30 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  gsz ){.      /* 
1cd40 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  The current docl
1cd50 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69  ist-index page i
1cd60 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74  s full. Write it
1cd70 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73   to disk and pus
1cd80 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70  h.      ** a cop
1cd90 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69  y of iRowid (whi
1cda0 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ch will become t
1cdb0 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1cdc0 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  n the next.     
1cdd0 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   ** doclist-inde
1cde0 78 20 6c 65 61 66 20 70 61 67 65 29 20 75 70 20  x leaf page) up 
1cdf0 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65  into the next le
1ce00 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65  vel of the b-tre
1ce10 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72  e .      ** hier
1ce20 61 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f  archy. If the no
1ce30 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64  de being flushed
1ce40 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68   is currently th
1ce50 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20  e root node,.   
1ce60 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20     ** also push 
1ce70 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20  its first rowid 
1ce80 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20  upwards. */.    
1ce90 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b    pDlidx->buf.p[
1cea0 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a  0] = 0x01;    /*
1ceb0 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f   Not the root no
1cec0 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  de */.      fts5
1ced0 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20  DataWrite(p, .  
1cee0 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
1cef0 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  DX_ROWID(pWriter
1cf00 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c  ->iSegid, i, pDl
1cf10 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20  idx->pgno),.    
1cf20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1cf30 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66  f.p, pDlidx->buf
1cf40 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
1cf50 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1cf60 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c  Grow(p, pWriter,
1cf70 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c   i+2);.      pDl
1cf80 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1cf90 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20  aDlidx[i];.     
1cfa0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1cfb0 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b  TE_OK && pDlidx[
1cfc0 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20  1].buf.n==0 ){. 
1cfd0 20 20 20 20 20 20 20 69 36 34 20 69 46 69 72 73         i64 iFirs
1cfe0 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74  t = fts5DlidxExt
1cff0 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 26  ractFirstRowid(&
1d000 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20  pDlidx->buf);.. 
1d010 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77         /* This w
1d020 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  as the root node
1d030 2e 20 50 75 73 68 20 69 74 73 20 66 69 72 73 74  . Push its first
1d040 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65   rowid up to the
1d050 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20   new root. */.  
1d060 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
1d070 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70  pgno = pDlidx->p
1d080 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  gno;.        sql
1d090 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1d0a0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d0b0 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
1d0c0 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 0);.        s
1d0d0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d0e0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d0f0 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1d100 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  buf, pDlidx->pgn
1d110 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1d120 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d130 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d140 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
1d150 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
1d160 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72     pDlidx[1].bPr
1d170 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  evValid = 1;.   
1d180 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69       pDlidx[1].i
1d190 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20  Prev = iFirst;. 
1d1a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
1d1b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
1d1c0 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  ero(&pDlidx->buf
1d1d0 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  );.      pDlidx-
1d1e0 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b  >bPrevValid = 0;
1d1f0 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70  .      pDlidx->p
1d200 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
1d210 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20  {.      bDone = 
1d220 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
1d230 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56  ( pDlidx->bPrevV
1d240 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56  alid ){.      iV
1d250 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44  al = iRowid - pD
1d260 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20  lidx->iPrev;.   
1d270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
1d280 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20  4 iPgno = (i==0 
1d290 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ? pWriter->write
1d2a0 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b  r.pgno : pDlidx[
1d2b0 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  -1].pgno);.     
1d2c0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1d2d0 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  >buf.n==0 );.   
1d2e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d2f0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d300 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d310 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a  ->buf, !bDone);.
1d320 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d330 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d340 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d350 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29  idx->buf, iPgno)
1d360 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69  ;.      iVal = i
1d370 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  Rowid;.    }..  
1d380 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d390 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d3a0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1d3b0 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20  >buf, iVal);.   
1d3c0 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1d3d0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c  lid = 1;.    pDl
1d3e0 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f  idx->iPrev = iRo
1d3f0 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  wid;.  }.}..stat
1d400 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1d410 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49  eFlushLeaf(Fts5I
1d420 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1d430 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1d440 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1d450 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30   u8 zero[] = { 0
1d460 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
1d470 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50   0x00 };.  Fts5P
1d480 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
1d490 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1d4a0 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  ter;.  i64 iRowi
1d4b0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  d;..  assert( (p
1d4c0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
1d4d0 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69  )==(pWriter->bFi
1d4e0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29  rstTermInPage) )
1d4f0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1d500 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69  szLeaf header fi
1d510 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  eld. */.  assert
1d520 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28  ( 0==fts5GetU16(
1d530 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d  &pPage->buf.p[2]
1d540 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31  ) );.  fts5PutU1
1d550 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
1d560 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e  2], (u16)pPage->
1d570 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70  buf.n);..  if( p
1d580 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d590 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  rmInPage ){.    
1d5a0 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77  /* No term was w
1d5b0 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70  ritten to this p
1d5c0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
1d5d0 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78  rt( pPage->pgidx
1d5e0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73  .n==0 );.    fts
1d5f0 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72  5WriteBtreeNoTer
1d600 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  m(p, pWriter);. 
1d610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
1d620 70 70 65 6e 64 20 74 68 65 20 70 67 69 64 78 20  ppend the pgidx 
1d630 74 6f 20 74 68 65 20 70 61 67 65 20 62 75 66 66  to the page buff
1d640 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65  er. Set the szLe
1d650 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e  af header field.
1d660 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66   */.    fts5Buff
1d670 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1d680 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1d690 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  , pPage->pgidx.n
1d6a0 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70  , pPage->pgidx.p
1d6b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
1d6c0 74 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  te the page out 
1d6d0 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f  to disk */.  iRo
1d6e0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1d6f0 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
1d700 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d  ->iSegid, pPage-
1d710 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61  >pgno);.  fts5Da
1d720 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69  taWrite(p, iRowi
1d730 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  d, pPage->buf.p,
1d740 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
1d750 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1d760 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20   the next page. 
1d770 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  */.  fts5BufferZ
1d780 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29  ero(&pPage->buf)
1d790 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  ;.  fts5BufferZe
1d7a0 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78  ro(&pPage->pgidx
1d7b0 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
1d7c0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1d7d0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
1d7e0 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65  , zero);.  pPage
1d7f0 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 30  ->iPrevPgidx = 0
1d800 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b  ;.  pPage->pgno+
1d810 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73  +;..  /* Increas
1d820 65 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69  e the leaves wri
1d830 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  tten counter */.
1d840 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
1d850 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a  Written++;..  /*
1d860 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f   The new leaf ho
1d870 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20  lds no terms or 
1d880 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69  rowids */.  pWri
1d890 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1d8a0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72  nPage = 1;.  pWr
1d8b0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1d8c0 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a  dInPage = 1;.}..
1d8d0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72  /*.** Append ter
1d8e0 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f  m pTerm/nTerm to
1d8f0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69   the segment bei
1d900 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68  ng written by th
1d910 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a  e writer passed.
1d920 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
1d930 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
1d940 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d950 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1d960 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1d970 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1d980 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1d990 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1d9a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1d9b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1d9c0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1d9d0 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35  pendTerm(.  Fts5
1d9e0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1d9f0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1da00 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d  ter,.  int nTerm
1da10 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
1da20 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65  m .){.  int nPre
1da30 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
1da40 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1da50 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72   of prefix compr
1da60 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20  ession for term 
1da70 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
1da80 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
1da90 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1daa0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
1dab0 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1dac0 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20  writer.pgidx;.. 
1dad0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1dae0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
1daf0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
1db00 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65  f.n>=4 );.  asse
1db10 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  rt( pPage->buf.n
1db20 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62  >4 || pWriter->b
1db30 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1db40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1db50 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
1db60 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68  e is full, flush
1db70 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a   it to disk. */.
1db80 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75    if( (pPage->bu
1db90 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  f.n + pPgidx->n 
1dba0 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d  + nTerm + 2)>=p-
1dbb0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
1dbc0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
1dbd0 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20  >buf.n>4 ){.    
1dbe0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1dbf0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1dc00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1dc10 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1dc20 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1dc30 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f  nTerm+FTS5_DATA_
1dc40 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20  PADDING);.  }.  
1dc50 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64  .  /* TODO1: Upd
1dc60 61 74 69 6e 67 20 70 67 69 64 78 20 68 65 72 65  ating pgidx here
1dc70 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e  . */.  pPgidx->n
1dc80 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
1dc90 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20  utVarint(.      
1dca0 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64  &pPgidx->p[pPgid
1dcb0 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75  x->n], pPage->bu
1dcc0 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72  f.n - pPage->iPr
1dcd0 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70  evPgidx.  );.  p
1dce0 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78  Page->iPrevPgidx
1dcf0 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b   = pPage->buf.n;
1dd00 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50 75 74  .#if 0.  fts5Put
1dd10 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70  U16(&pPgidx->p[p
1dd20 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65  Pgidx->n], pPage
1dd30 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69  ->buf.n);.  pPgi
1dd40 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64  dx->n += 2;.#end
1dd50 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65  if..  if( pWrite
1dd60 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1dd70 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66  age ){.    nPref
1dd80 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ix = 0;.    if( 
1dd90 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29  pPage->pgno!=1 )
1dda0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1ddb0 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
1ddc0 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74  m on a leaf that
1ddd0 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74   is not the left
1dde0 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20  most leaf in.   
1ddf0 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e     ** the segmen
1de00 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69  t b-tree. In thi
1de10 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63  s case it is nec
1de20 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20  essary to add a 
1de30 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a  term to.      **
1de40 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1de50 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61  archy that is (a
1de60 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  ) larger than th
1de70 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a  e largest term .
1de80 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
1de90 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1dea0 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20  segment and (b) 
1deb0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20  smaller than or 
1dec0 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a  equal to.      *
1ded0 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20  * this term. In 
1dee0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70  other words, a p
1def0 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f  refix of (pTerm/
1df00 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f  nTerm) that is o
1df10 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  ne.      ** byte
1df20 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65   longer than the
1df30 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20   longest prefix 
1df40 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68  (pTerm/nTerm) sh
1df50 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20  ares with the.  
1df60 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
1df70 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  term. .      **.
1df80 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79        ** Usually
1df90 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  , the previous t
1dfa0 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65  erm is available
1dfb0 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e   in pPage->term.
1dfc0 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20   The exception. 
1dfd0 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68       ** is if th
1dfe0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1dff0 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20  term written in 
1e000 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d  an incremental-m
1e010 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20  erge step..     
1e020 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
1e030 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
1e040 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  rm is not availa
1e050 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69  ble, so just wri
1e060 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  te a.      ** co
1e070 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65  py of (pTerm/nTe
1e080 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72  rm) into the par
1e090 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69  ent node. This i
1e0a0 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  s slightly.     
1e0b0 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c   ** inefficient,
1e0c0 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65   but still corre
1e0d0 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ct.  */.      in
1e0e0 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  t n = nTerm;.   
1e0f0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65     if( pPage->te
1e100 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  rm.n ){.        
1e110 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66  n = 1 + fts5Pref
1e120 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
1e130 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
1e140 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b  >term.p, pTerm);
1e150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1e160 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
1e170 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c  m(p, pWriter, n,
1e180 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70   pTerm);.      p
1e190 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1e1a0 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20  >writer;.    }. 
1e1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65   }else{.    nPre
1e1c0 66 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78  fix = fts5Prefix
1e1d0 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e  Compress(pPage->
1e1e0 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74  term.n, pPage->t
1e1f0 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20  erm.p, pTerm);. 
1e200 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1e210 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1e220 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1e230 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20  Prefix);.  }..  
1e240 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75  /* Append the nu
1e250 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1e260 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20   new data, then 
1e270 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74  the term data it
1e280 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65  self.  ** to the
1e290 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
1e2a0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e2b0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e2c0 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
1e2d0 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35  nPrefix);.  fts5
1e2e0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1e2f0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1e300 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
1e310 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50  refix, &pTerm[nP
1e320 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55  refix]);..  /* U
1e330 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61  pdate the Fts5Pa
1e340 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69  geWriter.term fi
1e350 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  eld. */.  fts5Bu
1e360 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1e370 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
1e380 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70  erm, pTerm);.  p
1e390 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1e3a0 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  rmInPage = 0;.. 
1e3b0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e3c0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
1e3d0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e3e0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1e3f0 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
1e400 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74   p->rc || (pWrit
1e410 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20  er->nDlidx>0 && 
1e420 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1e430 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a  0].buf.n==0) );.
1e440 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1e450 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67  x[0].pgno = pPag
1e460 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  e->pgno;.}../*.*
1e470 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64  * Append a rowid
1e480 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   and position-li
1e490 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f  st size field to
1e4a0 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74   the writers out
1e4b0 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  put. .*/.static 
1e4c0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1e4d0 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73  pendRowid(.  Fts
1e4e0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1e4f0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1e500 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77  iter,.  i64 iRow
1e510 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  id.){.  if( p->r
1e520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e530 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
1e540 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1e550 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20  iter->writer;.. 
1e560 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62     if( (pPage->b
1e570 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
1e580 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  idx.n)>=p->pConf
1e590 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1e5a0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1e5b0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1e5c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e5d0 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65  If this is to be
1e5e0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1e5f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e600 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20  page, set the . 
1e610 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e     ** rowid-poin
1e620 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d  ter in the page-
1e630 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70  header. Also app
1e640 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74  end a value to t
1e650 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20  he dlidx.    ** 
1e660 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20  buffer, in case 
1e670 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
1e680 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
1e690 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1e6a0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1e6b0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
1e6c0 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62  5PutU16(pPage->b
1e6d0 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61 67 65  uf.p, (u16)pPage
1e6e0 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
1e6f0 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1e700 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c  pend(p, pWriter,
1e710 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a   iRowid);.    }.
1e720 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
1e730 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20  e rowid. */.    
1e740 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1e750 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1e760 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
1e770 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1e780 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1e790 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e7a0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e7b0 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
1e7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e7d0 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
1e7e0 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e  iRowid>pWriter->
1e7f0 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20  iPrevRowid );.  
1e800 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1e810 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1e820 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1e830 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72  iRowid - pWriter
1e840 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20  ->iPrevRowid);. 
1e850 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72     }.    pWriter
1e860 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69  ->iPrevRowid = i
1e870 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74  Rowid;.    pWrit
1e880 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1e890 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20  nDoclist = 0;.  
1e8a0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1e8b0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
1e8c0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1e8d0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1e8e0 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
1e8f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1e900 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1e910 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63  r *pWriter, .  c
1e920 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
1e930 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a  .  int nData.){.
1e940 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1e950 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
1e960 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f  er->writer;.  co
1e970 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74  nst u8 *a = aDat
1e980 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61  a;.  int n = nDa
1e990 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  ta;.  .  assert(
1e9a0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1e9b0 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  z>0 );.  while( 
1e9c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e9d0 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
1e9e0 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d  ->buf.n + pPage-
1e9f0 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70  >pgidx.n + n)>=p
1ea00 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1ea10 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  .  ){.    int nR
1ea20 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  eq = p->pConfig-
1ea30 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62  >pgsz - pPage->b
1ea40 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67  uf.n - pPage->pg
1ea50 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  idx.n;.    int n
1ea60 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68  Copy = 0;.    wh
1ea70 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20  ile( nCopy<nReq 
1ea80 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d  ){.      i64 dum
1ea90 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20  my;.      nCopy 
1eaa0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
1eab0 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34  (&a[nCopy], (u64
1eac0 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d  *)&dummy);.    }
1ead0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1eae0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1eaf0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1eb00 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20  Copy, a);.    a 
1eb10 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20  += nCopy;.    n 
1eb20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74  -= nCopy;.    ft
1eb30 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1eb40 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1eb50 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
1eb60 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1eb70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1eb80 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20  &pPage->buf, n, 
1eb90 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
1eba0 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
1ebb0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
1ebc0 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
1ebd0 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
1ebe0 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
1ebf0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
1ec00 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
1ec10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ec20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1ec30 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ec40 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1ec50 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
1ec60 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1ec70 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
1ec80 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
1ec90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1eca0 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  : Number of leaf
1ecb0 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65   pages in b-tree
1ecc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1ecd0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1ece0 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74   *pLeaf = &pWrit
1ecf0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66  er->writer;.  if
1ed00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ed10 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1ed20 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31  ( pLeaf->pgno>=1
1ed30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61   );.    if( pLea
1ed40 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
1ed50 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1ed60 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1ed70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  r);.    }.    *p
1ed80 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70  nLeaf = pLeaf->p
1ed90 67 6e 6f 2d 31 3b 0a 20 20 20 20 69 66 28 20 70  gno-1;.    if( p
1eda0 4c 65 61 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a  Leaf->pgno>1 ){.
1edb0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1edc0 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72  lushBtree(p, pWr
1edd0 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iter);.    }.  }
1ede0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1edf0 65 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b  e(&pLeaf->term);
1ee00 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1ee10 65 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a  e(&pLeaf->buf);.
1ee20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1ee30 28 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b  (&pLeaf->pgidx);
1ee40 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1ee50 65 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65  e(&pWriter->btte
1ee60 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  rm);..  for(i=0;
1ee70 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   i<pWriter->nDli
1ee80 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  dx; i++){.    sq
1ee90 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1eea0 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44  ree(&pWriter->aD
1eeb0 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20  lidx[i].buf);.  
1eec0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1eed0 28 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  (pWriter->aDlidx
1eee0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1eef0 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  d fts5WriteInit(
1ef00 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ef10 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1ef20 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
1ef30 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63  nt iSegid.){.  c
1ef40 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72  onst int nBuffer
1ef50 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1ef60 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
1ef70 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73  PADDING;..  mems
1ef80 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
1ef90 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
1efa0 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
1efb0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1efc0 64 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44  d;..  fts5WriteD
1efd0 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
1efe0 74 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74  ter, 1);.  pWrit
1eff0 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20  er->writer.pgno 
1f000 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
1f010 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1f020 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1f030 3e 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20  >iBtPage = 1;.. 
1f040 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1f050 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d  ->writer.buf.n==
1f060 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1f070 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1f080 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20  gidx.n==0 );..  
1f090 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20  /* Grow the two 
1f0a0 62 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20  buffers to pgsz 
1f0b0 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20  + padding bytes 
1f0c0 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71  in size. */.  sq
1f0d0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1f0e0 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1f0f0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1f100 64 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20  dx, nBuffer);.  
1f110 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1f120 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70  rSize(&p->rc, &p
1f130 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f140 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20  uf, nBuffer);.. 
1f150 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74   if( p->pIdxWrit
1f160 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  er==0 ){.    Fts
1f170 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1f180 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1f190 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
1f1a0 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
1f1b0 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74  IdxWriter, sqlit
1f1c0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
1f1d0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1f1e0 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27  TO '%q'.'%q_idx'
1f1f0 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f  (segid,term,pgno
1f200 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22  ) VALUES(?,?,?)"
1f210 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  , .          pCo
1f220 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
1f230 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
1f240 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
1f250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f260 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1f270 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65  ze the 4-byte le
1f280 61 66 2d 70 61 67 65 20 68 65 61 64 65 72 20 74  af-page header t
1f290 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d  o 0x00. */.    m
1f2a0 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77  emset(pWriter->w
1f2b0 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20  riter.buf.p, 0, 
1f2c0 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  4);.    pWriter-
1f2d0 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20  >writer.buf.n = 
1f2e0 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20  4;..    /* Bind 
1f2f0 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70  the current outp
1f300 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f  ut segment id to
1f310 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65   the index-write
1f320 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20  r. This is an.  
1f330 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
1f340 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74  n over binding t
1f350 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76  he same value ov
1f360 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72  er and over as r
1f370 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  ows are.    ** i
1f380 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69  nserted into %_i
1f390 64 78 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  dx by the curren
1f3a0 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20  t writer.  */.  
1f3b0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1f3c0 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  nt(p->pIdxWriter
1f3d0 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  , 1, pWriter->iS
1f3e0 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  egid);.  }.}../*
1f3f0 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1f400 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
1f410 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1f420 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
1f430 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
1f440 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
1f450 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
1f460 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f470 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
1f480 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
1f490 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
1f4a0 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
1f4b0 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
1f4c0 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
1f4d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f4e0 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1f4f0 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
1f500 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
1f510 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
1f520 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
1f530 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
1f540 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
1f550 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
1f560 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
1f570 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49  +){.    Fts5SegI
1f580 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
1f590 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
1f5a0 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d   if( pSeg->pSeg=
1f5b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  =0 ){.      /* n
1f5c0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
1f5d0 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61  e if( pSeg->pLea
1f5e0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  f==0 ){.      /*
1f5f0 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74   All keys from t
1f600 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  his input segmen
1f610 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e  t have been tran
1f620 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75  sfered to the ou
1f630 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53  tput..      ** S
1f640 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73  et both the firs
1f650 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d  t and last page-
1f660 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20  numbers to 0 to 
1f670 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1f680 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
1f690 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e  nt is now empty.
1f6a0 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   */.      pSeg->
1f6b0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1f6c0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
1f6d0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1f6e0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f6f0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1f700 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1f710 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
1f720 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
1f730 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
1f740 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
1f750 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
1f760 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1f770 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
1f780 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
1f790 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
1f7a0 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
1f7b0 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20   0x00, 0x00};.. 
1f7c0 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
1f7d0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1f7e0 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e  OWID(iId, pSeg->
1f7f0 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
1f800 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
1f810 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c  s5DataRead(p, iL
1f820 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1f830 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
1f840 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1f850 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20  Zero(&buf);.    
1f860 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1f870 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ow(&p->rc, &buf,
1f880 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20   pData->nn);.   
1f890 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f8a0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1f8b0 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61  , &buf, sizeof(a
1f8c0 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20  Hdr), aHdr);.   
1f8d0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f8e0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1f8f0 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e  rc, &buf, pSeg->
1f900 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20  term.n);.       
1f910 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1f920 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1f930 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
1f940 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b  , pSeg->term.p);
1f950 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f960 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1f970 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1f980 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20  a->szLeaf-iOff, 
1f990 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
1f9a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
1f9b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1f9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1f9d0 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69  et the szLeaf fi
1f9e0 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eld */.         
1f9f0 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75 66   fts5PutU16(&buf
1fa00 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e  .p[2], (u16)buf.
1fa10 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  n);.        }.. 
1fa20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70         /* Set up
1fa30 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e   the new page-in
1fa40 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  dex array */.   
1fa50 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fa60 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fa70 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20  rc, &buf, 4);.  
1fa80 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
1fa90 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d  iLeafPgno==pSeg-
1faa0 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a  >iTermLeafPgno .
1fab0 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
1fac0 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
1fad0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20  pData->szLeaf . 
1fae0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1faf0 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20      int nDiff = 
1fb00 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20  pData->szLeaf - 
1fb10 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1fb20 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
1fb30 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1fb40 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
1fb50 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20  uf, buf.n - 1 - 
1fb60 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20  nDiff - 4);.    
1fb70 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fb80 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fb90 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20  c, &buf, .      
1fba0 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e          pData->n
1fbb0 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78  n - pSeg->iPgidx
1fbc0 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70  Off, &pData->p[p
1fbd0 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a  Seg->iPgidxOff].
1fbe0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1fbf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1fc00 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1fc10 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
1fc20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
1fc30 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
1fc40 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
1fc50 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
1fc60 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
1fc70 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31  ENT_ROWID(iId, 1
1fc80 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  ), iLeafRowid);.
1fc90 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1fca0 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f  Write(p, iLeafRo
1fcb0 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  wid, buf.p, buf.
1fcc0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1fcd0 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  }.  }.  fts5Buff
1fce0 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
1fcf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1fd00 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62  5MergeChunkCallb
1fd10 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
1fd20 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43   *p, .  void *pC
1fd30 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  tx, .  const u8 
1fd40 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
1fd50 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67  unk.){.  Fts5Seg
1fd60 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
1fd70 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65 72  = (Fts5SegWriter
1fd80 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72  *)pCtx;.  fts5Wr
1fd90 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
1fda0 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c  Data(p, pWriter,
1fdb0 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
1fdc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
1fdd0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1fde0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20  dexMergeLevel(. 
1fdf0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1fe20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1fe30 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1fe40 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
1fe50 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65  IN/OUT: Stucture
1fe60 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
1fe70 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe90 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  * Level to read 
1fea0 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  input from */.  
1feb0 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20  int *pnRem      
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fed0 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 74  /* Write up to t
1fee0 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20  his many output 
1fef0 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46  leaves */.){.  F
1ff00 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1ff10 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1ff20 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  t;.  Fts5Structu
1ff30 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
1ff40 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1ff50 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74  [iLvl];.  Fts5St
1ff60 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
1ff70 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 74 65  vlOut;.  Fts5Ite
1ff80 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20  r *pIter = 0;   
1ff90 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
1ffa0 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61  to read input da
1ffb0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  ta */.  int nRem
1ffc0 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65   = pnRem ? *pnRe
1ffd0 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75  m : 0;  /* Outpu
1ffe0 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  t leaf pages lef
1fff0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
20000 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20  int nInput;     
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
20030 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
20040 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
20050 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
20060 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
20070 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
20080 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
20090 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  g;     /* Output
200a0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
200b0 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20  s5Buffer term;. 
200c0 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20   int bOldest;   
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
200f0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
20100 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a  s the oldest */.
20110 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
20120 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
20130 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ail;.  const int
20140 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44   flags = FTS5IND
20150 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
20160 54 3b 0a 20 20 69 6e 74 20 62 54 65 72 6d 57 72  T;.  int bTermWr
20170 69 74 74 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  itten = 0;      
20180 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20190 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 6c 72  current term alr
201a0 65 61 64 79 20 6f 75 74 70 75 74 20 2a 2f 0a 0a  eady output */..
201b0 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
201c0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
201d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c  ;.  assert( pLvl
201e0 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
201f0 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  nSeg );..  memse
20200 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69  t(&writer, 0, si
20210 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
20220 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er));.  memset(&
20230 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
20240 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
20250 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
20260 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20   ){.    pLvlOut 
20270 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
20280 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20  el[iLvl+1];.    
20290 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d  assert( pLvlOut-
202a0 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e  >nSeg>0 );.    n
202b0 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  Input = pLvl->nM
202c0 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20 3d  erge;.    pSeg =
202d0 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
202e0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d  pLvlOut->nSeg-1]
202f0 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
20300 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
20310 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a   pSeg->iSegid);.
20320 20 20 20 20 77 72 69 74 65 72 2e 77 72 69 74 65      writer.write
20330 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  r.pgno = pSeg->p
20340 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77  gnoLast+1;.    w
20350 72 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d 20  riter.iBtPage = 
20360 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
20370 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73  int iSegid = fts
20380 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
20390 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20  , pStruct);..   
203a0 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46   /* Extend the F
203b0 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
203c0 65 63 74 20 61 73 20 72 65 71 75 69 72 65 64 20  ect as required 
203d0 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75  to ensure the ou
203e0 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d  tput.    ** segm
203f0 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20  ent exists. */. 
20400 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74     if( iLvl==pSt
20410 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29  ruct->nLevel-1 )
20420 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
20430 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
20440 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b  ->rc, ppStruct);
20450 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d  .      pStruct =
20460 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
20470 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
20480 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
20490 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
204a0 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20  iLvl+1, 1, 0);. 
204b0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
204c0 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20  eturn;.    pLvl 
204d0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
204e0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c  el[iLvl];.    pL
204f0 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  vlOut = &pStruct
20500 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d  ->aLevel[iLvl+1]
20510 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
20520 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
20530 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
20540 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
20550 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
20560 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
20570 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
20580 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
20590 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f  nSeg];.    pLvlO
205a0 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
205b0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
205c0 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69  = 1;.    pSeg->i
205d0 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
205e0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
205f0 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  gment++;..    /*
20600 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
20610 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
20620 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
20630 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   */.    nInput =
20640 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d   pLvl->nSeg;.  }
20650 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c  .  bOldest = (pL
20660 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26  vlOut->nSeg==1 &
20670 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
20680 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61  l==iLvl+2);..  a
20690 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29  ssert( iLvl>=0 )
206a0 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74  ;.  for(fts5Mult
206b0 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
206c0 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  uct, flags, 0, 0
206d0 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
206e0 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
206f0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
20700 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
20710 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
20720 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
20730 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
20740 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
20750 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
20760 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
20770 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
20780 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
207b0 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
207c0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
207d0 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
207e0 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
207f0 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d     pTerm = fts5M
20800 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
20810 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20  er, &nTerm);.   
20820 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
20830 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
20840 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
20850 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m) ){.      if( 
20860 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e  pnRem && writer.
20870 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65  nLeafWritten>nRe
20880 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  m ){.        bre
20890 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
208a0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
208b0 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
208c0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
208d0 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e      bTermWritten
208e0 20 3d 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   =0;.    }..    
208f0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79  /* Check for key
20900 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a   annihilation. *
20910 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 49 74  /.    if( pSegIt
20920 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28  er->nPos==0 && (
20930 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49  bOldest || pSegI
20940 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20  ter->bDel==0) ) 
20950 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 69  continue;..    i
20960 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
20970 5f 4f 4b 20 26 26 20 62 54 65 72 6d 57 72 69 74  _OK && bTermWrit
20980 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ten==0 ){.      
20990 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77  /* This is a new
209a0 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20   term. Append a 
209b0 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70  term to the outp
209c0 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
209d0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
209e0 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
209f0 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
20a00 6d 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d 57  m);.      bTermW
20a10 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ritten = 1;.    
20a20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
20a30 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
20a40 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
20a50 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20a60 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  IZE */.    fts5W
20a70 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
20a80 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35  p, &writer, fts5
20a90 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
20aa0 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  Iter));..    if(
20ab0 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
20ac0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
20ad0 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
20ae0 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->bDel ){.      
20af0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20b00 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
20b10 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
20b20 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
20b30 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
20b40 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Pos>0 ){.       
20b50 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20b60 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
20b70 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
20b80 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
20b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
20bb0 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
20bc0 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
20bd0 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
20be0 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67       nPos = pSeg
20bf0 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70  Iter->nPos*2 + p
20c00 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20  SegIter->bDel;. 
20c10 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20c20 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
20c30 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
20c40 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20  er.buf, nPos);. 
20c50 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
20c60 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74 65  erate(p, pSegIte
20c70 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65  r, (void*)&write
20c80 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e  r, fts5MergeChun
20c90 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  kCallback);.    
20ca0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  }.  }..  /* Flus
20cb0 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
20cc0 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
20cd0 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
20ce0 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
20cf0 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
20d00 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
20d10 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
20d20 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
20d30 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
20d40 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e  iter, &pSeg->pgn
20d50 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
20d60 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
20d70 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
20d80 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
20d90 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
20da0 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
20db0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
20dc0 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
20dd0 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
20de0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
20df0 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
20e00 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d  p, pLvl->aSeg[i]
20e10 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a  .iSegid);.    }.
20e20 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
20e30 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
20e40 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ments from the i
20e50 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
20e60 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
20e70 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  !=nInput ){.    
20e80 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70    int nMove = (p
20e90 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70  Lvl->nSeg - nInp
20ea0 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ut) * sizeof(Fts
20eb0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
20ec0 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  t);.      memmov
20ed0 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70  e(pLvl->aSeg, &p
20ee0 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74  Lvl->aSeg[nInput
20ef0 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d  ], nMove);.    }
20f00 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
20f10 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74  egment -= nInput
20f20 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67  ;.    pLvl->nSeg
20f30 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
20f40 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30  pLvl->nMerge = 0
20f50 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
20f60 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  pgnoLast==0 ){. 
20f70 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53       pLvlOut->nS
20f80 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72  eg--;.      pStr
20f90 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b  uct->nSegment--;
20fa0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
20fc0 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a  ->pgnoLast>0 );.
20fd0 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d      fts5TrimSegm
20fe0 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  ents(p, pIter);.
20ff0 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
21000 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a   = nInput;.  }..
21010 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
21020 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74  ree(pIter);.  ft
21030 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
21040 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
21050 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
21060 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
21070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
21080 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
21090 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
210a0 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  on the index..**
210b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
210c0 69 66 20 61 6e 79 20 63 68 61 6e 67 65 73 20 77  if any changes w
210d0 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d 61 64  ere actually mad
210e0 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
210f0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
21100 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 4d 65   int fts5IndexMe
21110 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
21120 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
21130 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
21140 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
21150 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
21160 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
21170 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
21180 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
21190 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
211a0 74 20 6e 50 67 2c 20 20 20 20 20 20 20 20 20 20  t nPg,          
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
211c0 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74   Pages of work t
211d0 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  o do */.  int nM
211e0 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
211f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
21200 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
21210 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
21220 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65   */.){.  int nRe
21230 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62  m = nPg;.  int b
21240 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 53  Ret = 0;.  Fts5S
21250 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
21260 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
21270 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26   while( nRem>0 &
21280 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
21290 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
212a0 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
212b0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
212c0 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
212d0 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
212e0 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
212f0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
21300 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
21310 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
21320 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
21330 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21340 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21350 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
21360 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
21370 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
21380 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
21390 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
213a0 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
213b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
213c0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
213d0 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
213e0 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
213f0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
21400 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
21410 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
21420 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
21430 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
21440 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
21450 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
21460 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
21470 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
21480 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
21490 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
214a0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
214b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
214c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
214d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
214e0 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
214f0 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
21500 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
21510 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
21520 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
21530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
21540 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
21550 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
21560 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
21570 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21580 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
21590 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
215a0 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
215b0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
215c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
215d0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
215e0 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
215f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
21600 20 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e    if( nBest<nMin
21610 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
21620 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
21630 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erge==0 ){.     
21640 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21650 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20    bRet = 1;.    
21660 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
21670 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
21680 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
21690 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
216a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
216b0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
216c0 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
216d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
216e0 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
216f0 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
21700 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
21710 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
21720 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 72 65 74  = pStruct;.  ret
21730 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn bRet;.}../*.
21740 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
21750 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
21760 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
21770 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
21780 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
21790 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
217a0 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
217b0 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
217c0 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
217d0 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20  f.** necessary, 
217e0 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
217f0 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e  ntal merge work.
21800 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21810 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
21820 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
21830 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
21840 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
21850 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
21860 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21870 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
21880 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
21890 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20  ndexAutomerge(. 
218a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
218d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
218e0 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
218f0 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
21900 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
21910 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
21920 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  ex */.  int nLea
21930 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
21940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21950 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76  r of output leav
21960 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  es just written 
21970 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
21980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21990 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
219a0 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20  omerge>0 ){.    
219b0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
219c0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
219d0 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69  ct;.    u64 nWri
219e0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
219f0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
21a00 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
21a10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
21a20 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a40 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
21a50 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
21a60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
21a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21a90 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
21aa0 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
21ab0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
21ac0 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
21ad0 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
21ae0 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
21af0 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
21b00 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
21b10 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
21b20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b  (int)(((nWrite +
21b30 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
21b40 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
21b50 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
21b60 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ));.    pStruct-
21b70 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
21b80 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65  = nLeaf;.    nRe
21b90 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f  m = (int)(p->nWo
21ba0 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
21bb0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
21bc0 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65  );..    fts5Inde
21bd0 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75  xMerge(p, ppStru
21be0 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f  ct, nRem, p->pCo
21bf0 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
21c00 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
21c10 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43   void fts5IndexC
21c20 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74  risismerge(.  Ft
21c30 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c50 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
21c60 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
21c70 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
21c80 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct        /* IN/
21c90 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
21ca0 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
21cb0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
21cc0 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70  t nCrisis = p->p
21cd0 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d  Config->nCrisisM
21ce0 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75  erge;.  Fts5Stru
21cf0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
21d00 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e   *ppStruct;.  in
21d10 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61  t iLvl = 0;..  a
21d20 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
21d30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
21d40 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
21d50 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
21d60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
21d70 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
21d80 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73  l].nSeg>=nCrisis
21d90 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
21da0 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
21db0 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30  pStruct, iLvl, 0
21dc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21dd0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
21de0 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
21df0 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20  el>(iLvl+1) );. 
21e00 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
21e10 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
21e20 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
21e30 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
21e40 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
21e50 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ct;.}..static in
21e60 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  t fts5IndexRetur
21e70 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
21e80 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
21e90 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  c;.  p->rc = SQL
21ea0 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
21eb0 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
21ec0 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
21ed0 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78  Ctx Fts5FlushCtx
21ee0 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  ;.struct Fts5Flu
21ef0 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e  shCtx {.  Fts5In
21f00 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73  dex *pIdx;.  Fts
21f10 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
21f20 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75  r; .};../*.** Bu
21f30 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74  ffer aBuf[] cont
21f40 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76  ains a list of v
21f50 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c  arints, all smal
21f60 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a  l enough to fit.
21f70 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  ** in a 32-bit i
21f80 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74  nteger. Return t
21f90 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c  he size of the l
21fa0 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66  argest prefix of
21fb0 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e   this .** list n
21fc0 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73  Max bytes or les
21fd0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
21fe0 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
21ff0 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74  listPrefix(const
22000 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e   u8 *aBuf, int n
22010 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  Max){.  int ret;
22020 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20  .  u32 dummy;.  
22030 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  ret = fts5GetVar
22040 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d  int32(aBuf, dumm
22050 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d  y);.  if( ret<nM
22060 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  ax ){.    while(
22070 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
22080 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  i = fts5GetVarin
22090 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20  t32(&aBuf[ret], 
220a0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66  dummy);.      if
220b0 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d  ( (ret + i) > nM
220c0 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ax ) break;.    
220d0 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20    ret += i;.    
220e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
220f0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  et;.}../*.** Flu
22100 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
22110 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  of in-memory has
22120 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f  h table iHash to
22130 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a   a new level-0 .
22140 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69  ** segment on di
22150 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20  sk. Also update 
22160 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
22170 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  g structure reco
22180 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
22190 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
221a0 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
221b0 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
221c0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
221d0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
221e0 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
221f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
22200 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
22210 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46  s5FlushOneHash(F
22220 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
22230 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20  Fts5Hash *pHash 
22240 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74  = p->pHash;.  Ft
22250 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
22260 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67  ruct;.  int iSeg
22270 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61  id;.  int pgnoLa
22280 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
22290 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
222a0 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
222b0 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a   in segment */..
222c0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65    /* Obtain a re
222d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
222e0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
222f0 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
22300 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a  w segment-id.  *
22310 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65  * for the new le
22320 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20  vel-0 segment.  
22330 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  */.  pStruct = f
22340 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
22350 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20  (p);.  iSegid = 
22360 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
22370 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  d(p, pStruct);. 
22380 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
22390 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
223a0 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
223b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
223c0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
223d0 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65  gsz;.    int eDe
223e0 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
223f0 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20  g->eDetail;.    
22400 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
22410 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
22420 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
22430 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
22440 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
22450 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
22460 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
22470 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
22480 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
22490 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
224a0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  idx;           /
224b0 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
224c0 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67  h to assemble pg
224d0 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35  idx */..    Fts5
224e0 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
224f0 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ;.    fts5WriteI
22500 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
22510 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42  iSegid);..    pB
22520 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  uf = &writer.wri
22530 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67  ter.buf;.    pPg
22540 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72  idx = &writer.wr
22550 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20  iter.pgidx;..   
22560 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69   /* fts5WriteIni
22570 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20  t() should have 
22580 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  initialized the 
22590 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74  buffers to (most
225a0 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20   likely).    ** 
225b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
225c0 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  e required. */. 
225d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
225e0 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65   || pBuf->nSpace
225f0 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  >=(pgsz + FTS5_D
22600 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a  ATA_PADDING) );.
22610 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
22620 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70  c || pPgidx->nSp
22630 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
22640 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
22650 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  );..    /* Begin
22660 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
22670 68 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74  h hash table ent
22680 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20  ries. This loop 
22690 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
226a0 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64  ch.    ** term/d
226b0 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79  oclist currently
226c0 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
226d0 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
226e0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
226f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22700 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
22710 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49  te3Fts5HashScanI
22720 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29  nit(pHash, 0, 0)
22730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
22740 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
22750 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
22760 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
22770 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20  (pHash) ){.     
22780 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
22790 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
227a0 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
227b0 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  g term */.      
227c0 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69  const u8 *pDocli
227d0 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  st;         /* P
227e0 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
227f0 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  t for this term 
22800 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  */.      int nDo
22810 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
22820 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22830 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  doclist in bytes
22840 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72   */..      /* Wr
22850 69 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72  ite the term for
22860 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64   this entry to d
22870 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  isk. */.      sq
22880 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
22890 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a  nEntry(pHash, &z
228a0 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c  Term, &pDoclist,
228b0 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20   &nDoclist);.   
228c0 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
228d0 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65  ndTerm(p, &write
228e0 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  r, (int)strlen(z
228f0 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38  Term), (const u8
22900 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20  *)zTerm);..     
22910 20 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e   assert( writer.
22920 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
22930 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
22940 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e  ( pgsz>=(pBuf->n
22950 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
22960 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a  Doclist + 1) ){.
22970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
22980 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
22990 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
229a0 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
229b0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
229c0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
229d0 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20  pBuf, pDoclist, 
229e0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
229f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22a00 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a  i64 iRowid = 0;.
22a10 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
22a20 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ta = 0;.        
22a30 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
22a40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
22a50 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c  tire doclist wil
22a60 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69  l not fit on thi
22a70 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c  s leaf. The foll
22a80 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  owing .        *
22a90 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20  * loop iterates 
22aa0 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c  through the posl
22ab0 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75  ists that make u
22ac0 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  p the current . 
22ad0 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73         ** doclis
22ae0 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  t.  */.        w
22af0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
22b00 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e  ITE_OK && iOff<n
22b10 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
22b20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
22b30 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63  5GetVarint(&pDoc
22b40 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34  list[iOff], (u64
22b50 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
22b60 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20        iRowid += 
22b70 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
22b80 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
22b90 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f   writer.bFirstRo
22ba0 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
22bb0 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74           fts5Put
22bc0 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c  U16(&pBuf->p[0],
22bd0 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20   (u16)pBuf->n); 
22be0 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64    /* first rowid
22bf0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
22c00 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
22c10 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
22c20 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
22c30 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69  [pBuf->n], iRowi
22c40 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
22c50 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
22c60 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
22c70 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
22c80 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
22c90 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69  , &writer, iRowi
22ca0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  d);.          }e
22cb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
22cc0 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
22cd0 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
22ce0 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
22cf0 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20  n], iDelta);.   
22d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d10 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
22d20 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
22d30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69   );..          i
22d40 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
22d50 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
22d60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22d70 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26  iOff<nDoclist &&
22d80 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d   pDoclist[iOff]=
22d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22da0 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66      pBuf->p[pBuf
22db0 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  ->n++] = 0;.    
22dc0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
22dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22de0 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73  if( iOff<nDoclis
22df0 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f  t && pDoclist[iO
22e00 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
22e10 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
22e20 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30  p[pBuf->n++] = 0
22e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22e40 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
22e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22e70 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
22e80 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70   + pPgidx->n)>=p
22e90 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
22ea0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
22eb0 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74  ushLeaf(p, &writ
22ec0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
22ed0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
22ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22ef0 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
22f00 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
22f10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
22f20 74 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65  t nCopy = fts5Ge
22f30 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44  tPoslistSize(&pD
22f40 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e  oclist[iOff], &n
22f50 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
22f60 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
22f70 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
22f80 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
22f90 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  >n + pPgidx->n +
22fa0 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20   nCopy) <= pgsz 
22fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22fc0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
22fd0 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oslist will fit 
22fe0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
22ff0 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20  eaf. So copy.   
23000 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
23010 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20   in one go. */. 
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
23030 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
23040 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f  dBlob(pBuf, &pDo
23050 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f  clist[iOff], nCo
23060 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  py);.           
23070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
23090 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
230a0 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
230b0 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65   leaf. So it nee
230c0 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ds.             
230d0 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e   ** to be broken
230e0 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20   into sections. 
230f0 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69  The only qualifi
23100 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20  cation being.   
23110 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
23120 61 74 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d  at each varint m
23130 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f  ust be stored co
23140 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a  ntiguously.  */.
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
23160 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74  nst u8 *pPoslist
23170 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66   = &pDoclist[iOf
23180 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f];.            
23190 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a    int iPos = 0;.
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
231b0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
231c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
231d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70           int nSp
231e0 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75  ace = pgsz - pBu
231f0 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e  f->n - pPgidx->n
23200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23210 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23230 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c   (nCopy - iPos)<
23240 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  =nSpace ){.     
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
23260 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20   nCopy - iPos;. 
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23280 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23290 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35          n = fts5
232a0 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70  PoslistPrefix(&p
232b0 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e  Poslist[iPos], n
232c0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
232d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
232e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
232f0 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( n>0 );.       
23300 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
23310 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
23320 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73  b(pBuf, &pPoslis
23330 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20  t[iPos], n);.   
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
23350 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
23360 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
23370 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
23380 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  )>=pgsz ){.     
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
233a0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
233b0 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
233e0 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29  f( iPos>=nCopy )
233f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23420 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b    iOff += nCopy;
23430 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
23450 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20        /* TODO2: 
23460 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74  Doclist terminat
23470 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e  or written here.
23480 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75   */.      /* pBu
23490 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
234a0 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20  = '\0'; */.     
234b0 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
234c0 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
234d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
234e0 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
234f0 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20  pHash);.    }.  
23500 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
23510 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20  hClear(pHash);. 
23520 20 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69     fts5WriteFini
23530 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
23540 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
23550 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
23560 73 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20  s5Structure. It 
23570 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
23580 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
23590 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74  by the.    ** ft
235a0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
235b0 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e  se() call below.
235c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
235d0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
235e0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
235f0 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
23600 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29  p->rc, &pStruct)
23610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
23620 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
23630 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
23640 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  ruct, 0, 1, 0);.
23650 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
23660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23670 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
23680 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
23690 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
236a0 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
236b0 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
236c0 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
236d0 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
236e0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53  st = 1;.      pS
236f0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70  eg->pgnoLast = p
23700 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70  gnoLast;.      p
23710 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
23720 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ++;.    }.    ft
23730 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
23740 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74  te(p, 0, pStruct
23750 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e  );.  }..  fts5In
23760 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20  dexAutomerge(p, 
23770 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61  &pStruct, pgnoLa
23780 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  st);.  fts5Index
23790 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26  Crisismerge(p, &
237a0 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
237b0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
237c0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74  , pStruct);.  ft
237d0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
237e0 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a  se(pStruct);.}..
237f0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
23800 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
23810 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
23820 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  h tables to the 
23830 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
23840 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
23850 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65  exFlush(Fts5Inde
23860 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65  x *p){.  /* Unle
23870 73 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20  ss it is empty, 
23880 66 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74  flush the hash t
23890 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  able to disk */.
238a0 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e    if( p->nPendin
238b0 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73  gData ){.    ass
238c0 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b  ert( p->pHash );
238d0 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
238e0 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74  Data = 0;.    ft
238f0 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70  s5FlushOneHash(p
23900 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
23910 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23920 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  fts5IndexOptimiz
23930 65 53 74 72 75 63 74 28 0a 20 20 46 74 73 35 49  eStruct(.  Fts5I
23940 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
23950 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
23960 63 74 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  ct.){.  Fts5Stru
23970 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
23980 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73  .  int nByte = s
23990 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
239a0 75 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65 67  ure);.  int nSeg
239b0 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67   = pStruct->nSeg
239c0 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ment;.  int i;..
239d0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
239e0 69 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  if this structur
239f0 65 20 72 65 71 75 69 72 65 73 20 6f 70 74 69 6d  e requires optim
23a00 69 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72 75 63  ization. A struc
23a10 74 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e  ture does.  ** n
23a20 6f 74 20 72 65 71 75 69 72 65 20 6f 70 74 69 6d  ot require optim
23a30 69 7a 61 74 69 6f 6e 20 69 66 20 65 69 74 68 65  ization if eithe
23a40 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20  r:.  **.  **  + 
23a50 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 66  it consists of f
23a60 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 73 65  ewer than two se
23a70 67 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a 2a  gments, or .  **
23a80 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73    + all segments
23a90 20 61 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65   are on the same
23aa0 20 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20   level, or.  ** 
23ab0 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20   + all segments 
23ac0 65 78 63 65 70 74 20 6f 6e 65 20 61 72 65 20 63  except one are c
23ad0 75 72 72 65 6e 74 6c 79 20 69 6e 70 75 74 73 20  urrently inputs 
23ae0 74 6f 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61  to a merge opera
23af0 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
23b00 49 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73  In the first cas
23b10 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  e, return NULL. 
23b20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 69  In the second, i
23b30 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
23b40 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a  -count.  ** on *
23b50 70 53 74 72 75 63 74 20 61 6e 64 20 72 65 74 75  pStruct and retu
23b60 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  rn a copy of the
23b70 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a   pointer to it..
23b80 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 3c    */.  if( nSeg<
23b90 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
23ba0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75  for(i=0; i<pStru
23bb0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  ct->nLevel; i++)
23bc0 7b 0a 20 20 20 20 69 6e 74 20 6e 54 68 69 73 20  {.    int nThis 
23bd0 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
23be0 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 69  l[i].nSeg;.    i
23bf0 66 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20 7c  f( nThis==nSeg |
23c00 7c 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d 31  | (nThis==nSeg-1
23c10 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
23c20 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e  vel[i].nMerge==n
23c30 54 68 69 73 29 20 29 7b 0a 20 20 20 20 20 20 66  This) ){.      f
23c40 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
23c50 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
23c60 72 65 74 75 72 6e 20 70 53 74 72 75 63 74 3b 0a  return pStruct;.
23c70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23c80 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ( pStruct->aLeve
23c90 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68  l[i].nMerge<=nTh
23ca0 69 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79  is );.  }..  nBy
23cb0 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e  te += (pStruct->
23cc0 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65  nLevel+1) * size
23cd0 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
23ce0 4c 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20 3d  Level);.  pNew =
23cf0 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a   (Fts5Structure*
23d00 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
23d10 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
23d20 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 4e  Byte);..  if( pN
23d30 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  ew ){.    Fts5St
23d40 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
23d50 76 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  vl;.    nByte = 
23d60 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
23d70 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
23d80 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nt);.    pNew->n
23d90 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
23da0 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70  >nLevel+1;.    p
23db0 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
23dc0 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43     pNew->nWriteC
23dd0 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74  ounter = pStruct
23de0 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  ->nWriteCounter;
23df0 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65  .    pLvl = &pNe
23e00 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63  w->aLevel[pStruc
23e10 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  t->nLevel];.    
23e20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
23e30 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
23e40 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
23e50 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63  allocZero(&p->rc
23e60 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
23e70 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a  ( pLvl->aSeg ){.
23e80 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
23e90 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  iSeg;.      int 
23ea0 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20  iSegOut = 0;.   
23eb0 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
23ec0 72 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d 65 6e  rough all segmen
23ed0 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20  ts, from oldest 
23ee0 74 6f 20 6e 65 77 65 73 74 2e 20 41 64 64 20 74  to newest. Add t
23ef0 68 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  hem to.      ** 
23f00 74 68 65 20 6e 65 77 20 46 74 73 35 4c 65 76 65  the new Fts5Leve
23f10 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  l object so that
23f20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d 20 69   pLvl->aSeg[0] i
23f30 73 20 74 68 65 20 6f 6c 64 65 73 74 0a 20 20 20  s the oldest.   
23f40 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e     ** segment in
23f50 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
23f60 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  ure.  */.      f
23f70 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75 63 74 2d  or(iLvl=pStruct-
23f80 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76 6c 3e  >nLevel-1; iLvl>
23f90 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20 20 20  =0; iLvl--){.   
23fa0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
23fb0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
23fc0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
23fd0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
23fe0 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
23ff0 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
24000 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
24010 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
24020 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b         iSegOut++
24030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24040 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
24050 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d  nSegment = pLvl-
24060 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20  >nSeg = nSeg;.  
24070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
24080 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
24090 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
240a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
240b0 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
240c0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
240d0 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
240e0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
240f0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
24100 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
24110 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
24120 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
24130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
24140 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
24150 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
24160 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24170 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72  ad(p);.  fts5Str
24180 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
24190 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72  (p);..  if( pStr
241a0 75 63 74 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  uct ){.    pNew 
241b0 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d  = fts5IndexOptim
241c0 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74  izeStruct(p, pSt
241d0 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73  ruct);.  }.  fts
241e0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
241f0 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 61  e(pStruct);..  a
24200 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30 20 7c  ssert( pNew==0 |
24210 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74  | pNew->nSegment
24220 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  >0 );.  if( pNew
24230 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
24240 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ;.    for(iLvl=0
24250 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  ; pNew->aLevel[i
24260 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 4c  Lvl].nSeg==0; iL
24270 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68 69 6c  vl++){}.    whil
24280 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
24290 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65  _OK && pNew->aLe
242a0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30  vel[iLvl].nSeg>0
242b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
242c0 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f  em = FTS5_OPT_WO
242d0 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66  RK_UNIT;.      f
242e0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
242f0 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76  el(p, &pNew, iLv
24300 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d  l, &nRem);.    }
24310 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ..    fts5Struct
24320 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77  ureWrite(p, pNew
24330 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
24340 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77  tureRelease(pNew
24350 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
24360 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
24370 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (p); .}../*.** T
24380 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  his is called to
24390 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
243a0 70 65 63 69 61 6c 20 22 56 41 4c 55 45 53 28 27  pecial "VALUES('
243b0 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72 67 65 29  merge', $nMerge)
243c0 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f 6d 6d  ".** INSERT comm
243d0 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
243e0 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67  te3Fts5IndexMerg
243f0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
24400 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46  int nMerge){.  F
24410 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
24420 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
24430 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
24440 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
24450 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 2d     int nMin = p-
24460 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d  >pConfig->nUserm
24470 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35 53 74  erge;.    fts5St
24480 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
24490 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d  e(p);.    if( nM
244a0 65 72 67 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  erge<0 ){.      
244b0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
244c0 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f  New = fts5IndexO
244d0 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c  ptimizeStruct(p,
244e0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20   pStruct);.     
244f0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24500 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24510 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20        pStruct = 
24520 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d 69 6e  pNew;.      nMin
24530 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d 65 72   = 2;.      nMer
24540 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31 3b 0a  ge = nMerge*-1;.
24550 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
24560 74 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74  truct && pStruct
24570 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  ->nLevel ){.    
24580 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 4d    if( fts5IndexM
24590 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
245a0 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 20  , nMerge, nMin) 
245b0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
245c0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
245d0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20   pStruct);.     
245e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
245f0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
24600 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
24610 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24620 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
24630 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24640 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
24650 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
24660 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73  64 iDelta,.  Fts
24670 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 2c 0a  5Iter *pUnused,.
24680 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
24690 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  uf.){.  UNUSED_P
246a0 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
246b0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
246c0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
246d0 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 7d  pBuf, iDelta);.}
246e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
246f0 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 28  s5AppendPoslist(
24700 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24710 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20  .  i64 iDelta,. 
24720 20 46 74 73 35 49 74 65 72 20 2a 70 4d 75 6c 74   Fts5Iter *pMult
24730 69 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i,.  Fts5Buffer 
24740 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 6e  *pBuf.){.  int n
24750 44 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e 62  Data = pMulti->b
24760 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61 73 73  ase.nData;.  ass
24770 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a  ert( nData>0 );.
24780 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
24790 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73  ITE_OK && 0==fts
247a0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
247b0 72 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2b  rc, pBuf, nData+
247c0 39 2b 39 29 20 29 7b 0a 20 20 20 20 66 74 73 35  9+9) ){.    fts5
247d0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
247e0 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65  Varint(pBuf, iDe
247f0 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35 42 75  lta);.    fts5Bu
24800 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
24810 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61 74 61  rint(pBuf, nData
24820 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  *2);.    fts5Buf
24830 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
24840 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d 3e  b(pBuf, pMulti->
24850 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44 61 74  base.pData, nDat
24860 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74  a);.  }.}...stat
24870 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
24880 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
24890 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
248a0 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70  er){.  u8 *p = p
248b0 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b  Iter->aPoslist +
248c0 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20   pIter->nSize + 
248d0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
248e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
248f0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20  r->aPoslist );. 
24900 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61   if( p>=pIter->a
24910 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  Eof ){.    pIter
24920 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
24930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
24940 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20   iDelta;..    p 
24950 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
24960 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  (p, (u64*)&iDelt
24970 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
24980 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
24990 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f  ..    /* Read po
249a0 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
249b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d   */.    if( p[0]
249c0 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
249d0 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
249e0 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20   pIter->nSize = 
249f0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
24a00 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  p, nPos);.      
24a10 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
24a20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20  = (nPos>>1);.   
24a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
24a40 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
24a50 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e  ((int)(p[0])) >>
24a60 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   1;.      pIter-
24a70 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  >nSize = 1;.    
24a80 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  }..    pIter->aP
24a90 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a  oslist = p;.  }.
24aa0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
24ab0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
24ac0 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
24ad0 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44   *pBuf, .  Fts5D
24ae0 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
24af0 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  r.){.  memset(pI
24b00 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
24b10 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
24b20 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75  ->aPoslist = pBu
24b30 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61  f->p;.  pIter->a
24b40 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70  Eof = &pBuf->p[p
24b50 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44  Buf->n];.  fts5D
24b60 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
24b70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a  Iter);.}..#if 0.
24b80 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64  /*.** Append a d
24b90 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72  oclist to buffer
24ba0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
24bb0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
24bc0 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69  es that space wi
24bd0 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  thin the buffer 
24be0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
24bf0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  .** allocated..*
24c00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
24c10 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
24c20 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  id(.  Fts5Buffer
24c30 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
24c40 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
24c50 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
24c60 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69   i64 *piLastRowi
24c70 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24c80 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76   /* IN/OUT: Prev
24c90 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74  ious rowid writt
24ca0 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  en (if any) */. 
24cb0 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20   i64 iRowid     
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70   /* Rowid to app
24ce0 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  end */.){.  asse
24cf0 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c  rt( pBuf->n!=0 |
24d00 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29  | (*piLastRowid)
24d10 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66  ==0 );.  fts5Buf
24d20 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
24d30 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64  int(pBuf, iRowid
24d40 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
24d50 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  ;.  *piLastRowid
24d60 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e   = iRowid;.}.#en
24d70 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  dif..#define fts
24d80 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
24d90 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77  d(pBuf, iLastRow
24da0 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20  id, iRowid) {   
24db0 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
24dc0 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20  (pBuf)->n!=0 || 
24dd0 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20  (iLastRowid)==0 
24de0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
24df0 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66       \.  fts5Buf
24e00 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
24e10 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f  int((pBuf), (iRo
24e20 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77  wid) - (iLastRow
24e30 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74  id)); \.  (iLast
24e40 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64  Rowid) = (iRowid
24e50 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
24e80 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65  * Swap the conte
24e90 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70  nts of buffer *p
24ea0 31 20 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a  1 with that of *
24eb0 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p2..*/.static vo
24ec0 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61  id fts5BufferSwa
24ed0 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31  p(Fts5Buffer *p1
24ee0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32  , Fts5Buffer *p2
24ef0 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ){.  Fts5Buffer 
24f00 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31  tmp = *p1;.  *p1
24f10 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20   = *p2;.  *p2 = 
24f20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tmp;.}..static v
24f30 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69  oid fts5NextRowi
24f40 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  d(Fts5Buffer *pB
24f50 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20  uf, int *piOff, 
24f60 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20  i64 *piRowid){. 
24f70 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b   int i = *piOff;
24f80 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e  .  if( i>=pBuf->
24f90 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20  n ){.    *piOff 
24fa0 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
24fb0 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
24fc0 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71   *piOff = i + sq
24fd0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
24fe0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20  nt(&pBuf->p[i], 
24ff0 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52  &iVal);.    *piR
25000 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
25010 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
25020 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
25030 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72  t of fts5MergePr
25040 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20  efixLists() for 
25050 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65  detail=none mode
25060 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73  ..** In this cas
25070 65 20 74 68 65 20 62 75 66 66 65 72 73 20 63 6f  e the buffers co
25080 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61  nsist of a delta
25090 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66  -encoded list of
250a0 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f   rowids only..*/
250b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
250c0 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73  5MergeRowidLists
250d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
250e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
250f0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
25100 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
25110 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
25140 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
25150 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
25160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25170 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
25180 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rge */.){.  int 
25190 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32  i1 = 0;.  int i2
251a0 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77   = 0;.  i64 iRow
251b0 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69  id1 = 0;.  i64 i
251c0 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36  Rowid2 = 0;.  i6
251d0 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46  4 iOut = 0;..  F
251e0 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20  ts5Buffer out;. 
251f0 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
25200 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
25210 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
25220 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
25230 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d  out, p1->n + p2-
25240 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  >n);.  if( p->rc
25250 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74   ) return;..  ft
25260 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20  s5NextRowid(p1, 
25270 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a  &i1, &iRowid1);.
25280 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25290 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64  p2, &i2, &iRowid
252a0 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e  2);.  while( i1>
252b0 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20  =0 || i2>=0 ){. 
252c0 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20     if( i1>=0 && 
252d0 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31  (i2<0 || iRowid1
252e0 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20  <iRowid2) ){.   
252f0 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d     assert( iOut=
25300 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f  =0 || iRowid1>iO
25310 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ut );.      fts5
25320 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
25330 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f  Varint(&out, iRo
25340 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20  wid1 - iOut);.  
25350 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69      iOut = iRowi
25360 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65  d1;.      fts5Ne
25370 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c  xtRowid(p1, &i1,
25380 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20   &iRowid1);.    
25390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
253a0 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20  ert( iOut==0 || 
253b0 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a  iRowid2>iOut );.
253c0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
253d0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
253e0 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d  (&out, iRowid2 -
253f0 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f   iOut);.      iO
25400 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20  ut = iRowid2;.  
25410 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26      if( i1>=0 &&
25420 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64   iRowid1==iRowid
25430 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  2 ){.        fts
25440 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
25450 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
25460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
25470 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26  5NextRowid(p2, &
25480 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20  i2, &iRowid2);. 
25490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
254a0 42 75 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c  BufferSwap(&out,
254b0 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66   p1);.  fts5Buff
254c0 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a  erFree(&out);.}.
254d0 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70  ./*.** Buffers p
254e0 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e  1 and p2 contain
254f0 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20   doclists. This 
25500 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20  function merges 
25510 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
25520 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73  f the two doclis
25530 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20  ts together and 
25540 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74  sets buffer p1 t
25550 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66  o the result bef
25560 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
25570 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
25580 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
25590 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
255a0 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61  t in p->rc. If a
255b0 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61  n error has.** a
255c0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
255d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
255e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
255f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
25600 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a  rgePrefixLists(.
25610 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
25640 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
25650 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25670 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
25680 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
25690 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
256a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
256b0 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
256c0 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32  e */.){.  if( p2
256d0 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ->n ){.    i64 i
256e0 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
256f0 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
25700 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44  er i1;.    Fts5D
25710 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20  oclistIter i2;. 
25720 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75     Fts5Buffer ou
25730 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20  t = {0, 0, 0};. 
25740 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d     Fts5Buffer tm
25750 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  p = {0, 0, 0};..
25760 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
25770 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
25780 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e  ->rc, &out, p1->
25790 6e 20 2b 20 70 32 2d 3e 6e 29 20 29 20 72 65 74  n + p2->n) ) ret
257a0 75 72 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  urn;.    fts5Doc
257b0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c  listIterInit(p1,
257c0 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44   &i1);.    fts5D
257d0 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70  oclistIterInit(p
257e0 32 2c 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68  2, &i2);..    wh
257f0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
25800 69 66 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32  if( i1.iRowid<i2
25810 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  .iRowid ){.     
25820 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
25830 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20   from i1 */.    
25840 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
25850 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
25860 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
25870 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
25880 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
25890 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31  endBlob(&out, i1
258a0 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50  .aPoslist, i1.nP
258b0 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29  oslist+i1.nSize)
258c0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
258d0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
258e0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
258f0 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29  i1.aPoslist==0 )
25900 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25910 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
25920 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f  2.iRowid!=i1.iRo
25930 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
25940 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
25950 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i2 */.        
25960 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
25970 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
25980 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
25990 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
259a0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
259b0 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f  lob(&out, i2.aPo
259c0 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69  slist, i2.nPosli
259d0 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20  st+i2.nSize);.  
259e0 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
259f0 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
25a00 20 20 20 20 20 20 20 20 69 66 28 20 69 32 2e 61          if( i2.a
25a10 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65  Poslist==0 ) bre
25a20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25a30 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
25a40 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f  /* Merge the two
25a50 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e   position lists.
25a60 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34   */ .        i64
25a70 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20   iPos1 = 0;.    
25a80 20 20 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20      i64 iPos2 = 
25a90 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
25aa0 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Off1 = 0;.      
25ab0 20 20 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b    int iOff2 = 0;
25ac0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 31 20  .        u8 *a1 
25ad0 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69  = &i1.aPoslist[i
25ae0 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  1.nSize];.      
25af0 20 20 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61    u8 *a2 = &i2.a
25b00 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65  Poslist[i2.nSize
25b10 5d 3b 0a 0a 20 20 20 20 20 20 20 20 69 36 34 20  ];..        i64 
25b20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  iPrev = 0;.     
25b30 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72     Fts5PoslistWr
25b40 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
25b50 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69       memset(&wri
25b60 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ter, 0, sizeof(w
25b70 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20  riter));..      
25b80 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
25b90 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
25ba0 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
25bb0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
25bc0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
25bd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25be0 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
25bf0 28 26 70 2d 3e 72 63 2c 20 26 74 6d 70 2c 20 69  (&p->rc, &tmp, i
25c00 31 2e 6e 50 6f 73 6c 69 73 74 20 2b 20 69 32 2e  1.nPoslist + i2.
25c10 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  nPoslist);.     
25c20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
25c30 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 73  reak;..        s
25c40 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
25c50 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
25c60 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
25c70 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
25c80 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
25c90 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69  listNext64(a2, i
25ca0 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  2.nPoslist, &iOf
25cb0 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20  f2, &iPos2);.   
25cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f       assert( iPo
25cd0 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d  s1>=0 && iPos2>=
25ce0 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  0 );..        if
25cf0 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b  ( iPos1<iPos2 ){
25d00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25d10 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
25d20 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
25d30 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20  Prev, iPos1);.  
25d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25d50 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
25d60 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  (a1, i1.nPoslist
25d70 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31  , &iOff1, &iPos1
25d80 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
25d90 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
25da0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
25db0 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
25dc0 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20  iPrev, iPos2);. 
25dd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25de0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
25df0 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
25e00 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
25e10 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  2);.        }.. 
25e20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
25e30 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20  >=0 && iPos2>=0 
25e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
25e50 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20  le( 1 ){.       
25e60 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69       if( iPos1<i
25e70 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos2 ){.        
25e80 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21        if( iPos1!
25e90 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
25ea0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25eb0 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
25ec0 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
25ed0 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20  rev, iPos1);.   
25ee0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25ef0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25f00 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
25f10 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c  t64(a1, i1.nPosl
25f20 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50  ist, &iOff1, &iP
25f30 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
25f40 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20      if( iPos1<0 
25f50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
25f60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25f70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25f80 28 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29  ( iPos2!=iPrev )
25f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25fa0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
25fb0 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
25fc0 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32  p, &iPrev, iPos2
25fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
25fe0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
25ff0 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
26000 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
26010 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
26020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
26030 6f 73 32 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20  os2<0 ) break;. 
26040 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26060 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
26070 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20  iPos1>=0 ){.    
26080 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21        if( iPos1!
26090 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
260a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
260b0 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
260c0 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
260d0 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20   iPos1);.       
260e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
260f0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
26100 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61  endBlob(&tmp, &a
26110 31 5b 69 4f 66 66 31 5d 2c 20 69 31 2e 6e 50 6f  1[iOff1], i1.nPo
26120 73 6c 69 73 74 2d 69 4f 66 66 31 29 3b 0a 20 20  slist-iOff1);.  
26130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26140 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
26150 50 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos2>=0 && iPos2
26160 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20  !=iPrev );.     
26170 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26180 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
26190 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
261a0 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
261b0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
261c0 41 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c  AppendBlob(&tmp,
261d0 20 26 61 32 5b 69 4f 66 66 32 5d 2c 20 69 32 2e   &a2[iOff2], i2.
261e0 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66 32 29 3b  nPoslist-iOff2);
261f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
26200 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
26210 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
26220 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
26230 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f  eAppendVarint(&o
26240 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a  ut, tmp.n * 2);.
26250 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26260 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26270 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d  (&out, tmp.p, tm
26280 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  p.n);.        ft
26290 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
262a0 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&i1);.        
262b0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
262c0 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
262d0 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
262e0 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c  t==0 || i2.aPosl
262f0 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
26300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26310 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69     if( i1.aPosli
26320 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  st ){.      fts5
26330 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
26340 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
26350 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i1.iRowid);. 
26360 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
26370 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
26380 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c  ut, i1.aPoslist,
26390 20 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50   i1.aEof - i1.aP
263a0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oslist);.    }. 
263b0 20 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61     else if( i2.a
263c0 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Poslist ){.     
263d0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
263e0 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73  Docid(&out, iLas
263f0 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
26400 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  d);.      fts5Bu
26410 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
26420 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
26430 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20  list, i2.aEof - 
26440 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i2.aPoslist);.  
26450 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66    }..    fts5Buf
26460 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70  ferSet(&p->rc, p
26470 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29  1, out.n, out.p)
26480 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
26490 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20  Free(&tmp);.    
264a0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
264b0 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  out);.  }.}..sta
264c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74  tic void fts5Set
264d0 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20  upPrefixIter(.  
264e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26500 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64  /* Index to read
26510 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   from */.  int b
26520 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  Desc,           
26530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26540 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59  ue for "ORDER BY
26550 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a   rowid DESC" */.
26560 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b    const u8 *pTok
26570 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
26580 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
26590 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f  aining prefix to
265a0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20   match */.  int 
265b0 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
265c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
265d0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54  ize of buffer pT
265e0 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  oken in bytes */
265f0 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
26600 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
26610 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d     /* Restrict m
26620 61 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20  atches to these 
26630 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73  columns */.  Fts
26640 35 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20  5Iter **ppIter  
26650 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26660 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  New iterator */.
26670 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
26680 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
26690 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
266a0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
266b0 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20  f = 32;..  void 
266c0 28 2a 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e  (*xMerge)(Fts5In
266d0 64 65 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72  dex*, Fts5Buffer
266e0 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b  *, Fts5Buffer*);
266f0 0a 20 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e  .  void (*xAppen
26700 64 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69  d)(Fts5Index*, i
26710 36 34 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46  64, Fts5Iter*, F
26720 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69  ts5Buffer*);.  i
26730 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  f( p->pConfig->e
26740 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
26750 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
26760 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72  xMerge = fts5Mer
26770 67 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20  geRowidLists;.  
26780 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35    xAppend = fts5
26790 41 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d  AppendRowid;.  }
267a0 65 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65  else{.    xMerge
267b0 20 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66   = fts5MergePref
267c0 69 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70  ixLists;.    xAp
267d0 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e  pend = fts5Appen
267e0 64 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20  dPoslist;.  }.. 
267f0 20 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66   aBuf = (Fts5Buf
26800 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c  fer*)fts5IdxMall
26810 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
26820 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a  5Buffer)*nBuf);.
26830 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
26840 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
26850 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26  ;..  if( aBuf &&
26860 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
26870 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
26880 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  = FTS5INDEX_QUER
26890 59 5f 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20  Y_SCAN .        
268a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54              | FT
268b0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b  S5INDEX_QUERY_SK
268c0 49 50 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20  IPEMPTY .       
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
268e0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
268f0 4f 4f 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74  OOUTPUT;.    int
26900 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   i;.    i64 iLas
26910 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
26920 46 74 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30  Fts5Iter *p1 = 0
26930 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  ;     /* Iterato
26940 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72  r used to gather
26950 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78   data from index
26960 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61   */.    Fts5Data
26970 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73   *pData;.    Fts
26980 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b  5Buffer doclist;
26990 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72  .    int bNewTer
269a0 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73  m = 1;..    mems
269b0 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20  et(&doclist, 0, 
269c0 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29  sizeof(doclist))
269d0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
269e0 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
269f0 74 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65  t, flags, pColse
26a00 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  t, pToken, nToke
26a10 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a  n, -1, 0, &p1);.
26a20 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f      fts5IterSetO
26a30 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20  utputCb(&p->rc, 
26a40 70 31 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a  p1);.    for( /*
26a50 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20   no-op */ ;.    
26a60 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
26a70 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a  rEof(p, p1)==0;.
26a80 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
26a90 69 49 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31  iIterNext2(p, p1
26aa0 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20  , &bNewTerm).   
26ab0 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
26ac0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
26ad0 31 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69  1->aSeg[ p1->aFi
26ae0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
26af0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
26b00 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b   = pSeg->term.n;
26b10 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
26b20 2a 70 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74  *pTerm = pSeg->t
26b30 65 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d  erm.p;.      p1-
26b40 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c  >xSetOutputs(p1,
26b50 20 70 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61   pSeg);..      a
26b60 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70  ssert_nc( memcmp
26b70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
26b80 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72  MIN(nToken, nTer
26b90 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20  m))<=0 );.      
26ba0 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
26bb0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72          if( nTer
26bc0 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63  m<nToken || memc
26bd0 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
26be0 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61  , nToken) ) brea
26bf0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
26c00 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e    if( p1->base.n
26c10 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Data==0 ) contin
26c20 75 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ue;..      if( p
26c30 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d  1->base.iRowid<=
26c40 69 4c 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f  iLastRowid && do
26c50 63 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20  clist.n>0 ){.   
26c60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
26c70 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
26c80 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b  & doclist.n; i++
26c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
26ca0 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
26cb0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
26cc0 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
26cd0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
26ce0 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
26cf0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
26d00 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
26d10 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
26d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
26d30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26d40 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69  xMerge(p, &docli
26d50 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
26d60 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
26d70 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b  ufferZero(&aBuf[
26d80 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
26d90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26da0 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20     iLastRowid = 
26db0 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
26dc0 20 20 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d    xAppend(p, p1-
26dd0 3e 62 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61  >base.iRowid-iLa
26de0 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f  stRowid, p1, &do
26df0 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c  clist);.      iL
26e00 61 73 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62  astRowid = p1->b
26e10 61 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20  ase.iRowid;.    
26e20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
26e30 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
26e40 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
26e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26e60 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64      xMerge(p, &d
26e70 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
26e80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26e90 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
26ea0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d  &aBuf[i]);.    }
26eb0 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
26ec0 65 72 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20  erFree(p1);..   
26ed0 20 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78   pData = fts5Idx
26ee0 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
26ef0 28 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63  (Fts5Data) + doc
26f00 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28  list.n);.    if(
26f10 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
26f20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29  pData->p = (u8*)
26f30 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20  &pData[1];.     
26f40 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61   pData->nn = pDa
26f50 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63  ta->szLeaf = doc
26f60 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66  list.n;.      if
26f70 28 20 64 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65  ( doclist.n ) me
26f80 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64  mcpy(pData->p, d
26f90 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73  oclist.p, doclis
26fa0 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  t.n);.      fts5
26fb0 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c  MultiIterNew2(p,
26fc0 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70   pData, bDesc, p
26fd0 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
26fe0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
26ff0 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a  (&doclist);.  }.
27000 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
27010 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
27020 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
27030 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  (aBuf);.}.../*.*
27040 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
27050 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63  all subsequent c
27060 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46  alls to sqlite3F
27070 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20  ts5IndexWrite() 
27080 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68  pertain.** to th
27090 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
270a0 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f  rowid iRowid..*/
270b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
270c0 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
270d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
270e0 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69  t bDelete, i64 i
270f0 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74  Rowid){.  assert
27100 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
27110 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  OK );..  /* Allo
27120 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61  cate the hash ta
27130 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ble if it has no
27140 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  t already been a
27150 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66  llocated */.  if
27160 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b  ( p->pHash==0 ){
27170 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
27180 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28  ite3Fts5HashNew(
27190 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e  p->pConfig, &p->
271a0 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
271b0 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
271c0 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
271d0 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
271e0 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
271f0 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e    if( iRowid<p->
27200 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20  iWriteRowid .   
27210 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69  || (iRowid==p->i
27220 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d  WriteRowid && p-
27230 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20  >bDelete==0).   
27240 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  || (p->nPendingD
27250 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67  ata > p->pConfig
27260 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20  ->nHashSize) .  
27270 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
27280 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20  Flush(p);.  }.. 
27290 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20   p->iWriteRowid 
272a0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62  = iRowid;.  p->b
272b0 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65  Delete = bDelete
272c0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
272d0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
272e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64  ../*.** Commit d
272f0 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ata to disk..*/.
27300 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27310 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64  ndexSync(Fts5Ind
27320 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ex *p){.  assert
27330 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
27340 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
27350 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73  xFlush(p);.  fts
27360 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
27370 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
27380 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
27390 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
273a0 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
273b0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
273c0 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20  hash tables. Do 
273d0 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20  not write it.** 
273e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
273f0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61   Additionally, a
27400 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63  ssume that the c
27410 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25  ontents of the %
27420 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d  _data.** table m
27430 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  ay have changed 
27440 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20  on disk. So any 
27450 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73  in-memory caches
27460 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72   of %_data .** r
27470 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69  ecords must be i
27480 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69  nvalidated..*/.i
27490 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
274a0 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35  dexRollback(Fts5
274b0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73  Index *p){.  fts
274c0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
274d0 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  .  fts5IndexDisc
274e0 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20 66 74  ardData(p);.  ft
274f0 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
27500 69 64 61 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61  idate(p);.  /* a
27510 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
27520 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20  LITE_OK ); */.  
27530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25  ;.}../*.** The %
27550 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63  _data table is c
27560 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
27570 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
27580 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  on is called. Th
27590 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  is.** function p
275a0 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68  opulates it with
275b0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72   the initial str
275c0 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66  ucture objects f
275d0 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a  or each index,.*
275e0 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61  * and the initia
275f0 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  l version of the
27600 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
27610 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20  rd (a zero-byte 
27620 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  blob)..*/.int sq
27630 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
27640 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a  init(Fts5Index *
27650 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
27660 75 72 65 20 73 3b 0a 20 20 66 74 73 35 53 74 72  ure s;.  fts5Str
27670 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
27680 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  (p);.  memset(&s
27690 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
276a0 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66  Structure));.  f
276b0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
276c0 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
276d0 57 49 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  WID, (const u8*)
276e0 22 22 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74  "", 0);.  fts5St
276f0 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
27700 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  &s);.  return ft
27710 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
27720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
27730 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20  a new Fts5Index 
27740 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62  handle. If the b
27750 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20  Create argument 
27760 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a  is true, create.
27770 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
27780 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
27790 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
277a0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
277b0 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ul, set *pp to p
277c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
277d0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
277e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
277f0 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a  Otherwise, set *
27800 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72  pp to NULL and r
27810 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27820 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
27830 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27840 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43  dexOpen(.  Fts5C
27850 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
27860 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  .  int bCreate, 
27870 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70  .  Fts5Index **p
27880 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  p,.  char **pzEr
27890 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
278a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
278b0 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20  5Index *p;      
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278d0 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  New object */.. 
278e0 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35   *pp = p = (Fts5
278f0 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74  Index*)sqlite3Ft
27900 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
27910 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
27920 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex));.  if( rc==
27930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27940 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43   p->pConfig = pC
27950 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57  onfig;.    p->nW
27960 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57  orkUnit = FTS5_W
27970 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d  ORK_UNIT;.    p-
27980 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69  >zDataTbl = sqli
27990 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26  te3Fts5Mprintf(&
279a0 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70  rc, "%s_data", p
279b0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a  Config->zName);.
279c0 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61      if( p->zData
279d0 54 62 6c 20 26 26 20 62 43 72 65 61 74 65 20 29  Tbl && bCreate )
279e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
279f0 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
27a00 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ble(.          p
27a10 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
27a20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
27a30 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
27a40 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20  LOB", 0, pzErr. 
27a50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
27a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27a70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27a80 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
27a90 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20  eTable(pConfig, 
27aa0 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20  "idx", .        
27ab0 20 20 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d      "segid, term
27ac0 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20  , pgno, PRIMARY 
27ad0 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29  KEY(segid, term)
27ae0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
27af0 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20  1, pzErr.       
27b00 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
27b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
27b30 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
27b40 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20  ndexReinit(p);. 
27b50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27b60 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ..  assert( rc!=
27b70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
27b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
27b90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
27ba0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27bb0 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a  xClose(p);.    *
27bc0 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  pp = 0;.  }.  re
27bd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27be0 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  * Close a handle
27bf0 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
27c00 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
27c10 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
27c20 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
27c30 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
27c40 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  se(Fts5Index *p)
27c50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27c60 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
27c70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27c80 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
27c90 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
27ca0 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
27cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
27cc0 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29  lize(p->pWriter)
27cd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
27ce0 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74  nalize(p->pDelet
27cf0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
27d00 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
27d10 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71  xWriter);.    sq
27d20 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
27d30 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a  ->pIdxDeleter);.
27d40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
27d50 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65  lize(p->pIdxSele
27d60 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
27d70 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61  _finalize(p->pDa
27d80 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20  taVersion);.    
27d90 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46  sqlite3Fts5HashF
27da0 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20  ree(p->pHash);. 
27db0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27dc0 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20  p->zDataTbl);.  
27dd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27de0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27df0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  rc;.}../*.** Arg
27e00 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74  ument p points t
27e10 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
27e20 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74  ining utf-8 text
27e30 20 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73   that is n bytes
27e40 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65   in .** size. Re
27e50 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
27e60 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
27e70 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20  nChar character 
27e80 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a  prefix of the.**
27e90 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66   buffer, or 0 if
27ea0 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
27eb0 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61  than nChar chara
27ec0 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a  cters in total..
27ed0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27ee0 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
27ef0 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74  Bytelen(.  const
27f00 20 63 68 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74   char *p, .  int
27f10 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e   nByte, .  int n
27f20 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20  Char.){.  int n 
27f30 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
27f40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72  for(i=0; i<nChar
27f50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
27f60 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72  n>=nByte ) retur
27f70 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70  n 0;      /* Inp
27f80 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ut contains fewe
27f90 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  r than nChar cha
27fa0 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75  rs */.    if( (u
27fb0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e  nsigned char)p[n
27fc0 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
27fd0 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20     while( (p[n] 
27fe0 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
27ff0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
28000 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
28010 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46  .** pIn is a UTF
28020 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
28030 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20  g, nIn bytes in 
28040 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65  size. Return the
28050 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e   number of.** un
28060 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
28070 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a   in the string..
28080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
28090 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63  s5IndexCharlen(c
280a0 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20  onst char *pIn, 
280b0 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20  int nIn){.  int 
280c0 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  nChar = 0;      
280d0 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d        .  int i =
280e0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   0;.  while( i<n
280f0 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75  In ){.    if( (u
28100 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e  nsigned char)pIn
28110 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [i++]>=0xc0 ){. 
28120 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49       while( i<nI
28130 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30  n && (pIn[i] & 0
28140 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b  xc0)==0x80 ) i++
28150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61  ;.    }.    nCha
28160 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
28170 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nChar;.}../*.*
28180 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f  * Insert or remo
28190 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72  ve data to or fr
281a0 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61  om the index. Ea
281b0 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65  ch time a docume
281c0 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20  nt is .** added 
281d0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
281e0 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  om the index, th
281f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
28200 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  alled one or mor
28210 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a  e.** times..**.*
28220 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c  * For an insert,
28230 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
28240 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
28250 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65   token in the ne
28260 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49  w document..** I
28270 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
28280 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20  is a delete, it 
28290 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28  must be called (
282a0 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66  at least) once f
282b0 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75  or each.** uniqu
282c0 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64  e token in the d
282d0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  ocument with an 
282e0 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20  iCol value less 
282f0 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69  than zero. The i
28300 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  Pos.** argument 
28310 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61  is ignored for a
28320 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20   delete..*/.int 
28330 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28340 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64  Write(.  Fts5Ind
28350 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
28360 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
28370 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  x to write to */
28380 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b     /* Column tok
283b0 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d  en appears in (-
283c0 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f  ve -> delete) */
283d0 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
28400 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63  f token within c
28410 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
28420 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
28430 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f  nt nToken  /* To
28440 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65  ken to add or re
28450 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20  move to or from 
28460 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e  index */.){.  in
28470 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28490 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
284a0 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
284b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
284c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
284d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
284e0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
284f0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
28500 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61  p->pConfig;..  a
28510 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
28520 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
28530 65 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70  ert( (iCol<0)==p
28540 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20  ->bDelete );..  
28550 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79  /* Add the entry
28560 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72   to the main ter
28570 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72  ms index. */.  r
28580 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
28590 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20  ashWrite(.      
285a0 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72  p->pHash, p->iWr
285b0 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
285c0 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f  iPos, FTS5_MAIN_
285d0 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20  PREFIX, pToken, 
285e0 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66  nToken.  );..  f
285f0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
28600 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63  g->nPrefix && rc
28610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
28620 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
28630 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e 66 69 67   nChar = pConfig
28640 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20  ->aPrefix[i];.  
28650 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
28660 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 68  lite3Fts5IndexCh
28670 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70  arlenToBytelen(p
28680 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e  Token, nToken, n
28690 43 68 61 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  Char);.    if( n
286a0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Byte ){.      rc
286b0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
286c0 73 68 57 72 69 74 65 28 70 2d 3e 70 48 61 73 68  shWrite(p->pHash
286d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  , .          p->
286e0 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
286f0 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61 72 29 28  l, iPos, (char)(
28700 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
28710 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20  +i+1), pToken,. 
28720 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 0a 20           nByte. 
28730 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
28740 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
28750 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
28760 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20  new iterator to 
28770 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61  iterate though a
28780 6c 6c 20 72 6f 77 69 64 20 74 68 61 74 20 6d 61  ll rowid that ma
28790 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63  tch the .** spec
287a0 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74  ified token or t
287b0 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a  oken prefix..*/.
287c0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
287d0 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46 74 73  ndexQuery(.  Fts
287e0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28800 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65  FTS index to que
28810 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ry */.  const ch
28820 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20  ar *pToken, int 
28830 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e  nToken, /* Token
28840 20 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20   (or prefix) to 
28850 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
28860 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28880 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
28890 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67  DEX_QUERY_X flag
288a0 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  s */.  Fts5Colse
288b0 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
288c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20         /* Match 
288d0 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e  these columns on
288e0 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  ly */.  Fts5Inde
288f0 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20  xIter **ppIter  
28900 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
28910 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  New iterator obj
28920 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
28930 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
28940 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
28950 46 74 73 35 49 74 65 72 20 2a 70 52 65 74 20 3d  Fts5Iter *pRet =
28960 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   0;.  Fts5Buffer
28970 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d   buf = {0, 0, 0}
28980 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51  ;..  /* If the Q
28990 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69  UERY_SCAN flag i
289a0 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72  s set, all other
289b0 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63   flags must be c
289c0 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lear. */.  asser
289d0 74 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  t( (flags & FTS5
289e0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
289f0 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46  )==0 || flags==F
28a00 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
28a10 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71  CAN );..  if( sq
28a20 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
28a30 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  ize(&p->rc, &buf
28a40 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29  , nToken+1)==0 )
28a50 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d  {.    int iIdx =
28a60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28a70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
28a80 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 66  search */.    if
28a90 28 20 6e 54 6f 6b 65 6e 20 29 20 6d 65 6d 63 70  ( nToken ) memcp
28aa0 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f  y(&buf.p[1], pTo
28ab0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20  ken, nToken);.. 
28ac0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
28ad0 20 77 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20   which index to 
28ae0 73 65 61 72 63 68 20 61 6e 64 20 73 65 74 20 69  search and set i
28af0 49 64 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  Idx accordingly.
28b00 20 49 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   If this.    ** 
28b10 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72  is a prefix quer
28b20 79 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  y for which ther
28b30 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69  e is no prefix i
28b40 6e 64 65 78 2c 20 73 65 74 20 69 49 64 78 20 74  ndex, set iIdx t
28b50 6f 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72  o.    ** greater
28b60 20 74 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e   than pConfig->n
28b70 50 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61  Prefix to indica
28b80 74 65 20 74 68 61 74 20 74 68 65 20 71 75 65 72  te that the quer
28b90 79 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  y will be.    **
28ba0 20 73 61 74 69 73 66 69 65 64 20 62 79 20 73 63   satisfied by sc
28bb0 61 6e 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  anning multiple 
28bc0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69  terms in the mai
28bd0 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
28be0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55      ** If the QU
28bf0 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66  ERY_TEST_NOIDX f
28c00 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
28c10 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73  d, then this mus
28c20 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72  t be a.    ** pr
28c30 65 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74  efix-query. Inst
28c40 65 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70  ead of using a p
28c50 72 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20  refix-index (if 
28c60 6f 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20  one exists), .  
28c70 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68    ** evaluate th
28c80 65 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75  e prefix query u
28c90 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54  sing the main FT
28ca0 53 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73  S index. This is
28cb0 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72   used.    ** for
28cc0 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79   internal sanity
28cd0 20 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65   checking by the
28ce0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
28cf0 20 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a   in debug .    *
28d00 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f  * mode only.  */
28d10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
28d20 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f  EBUG.    if( pCo
28d30 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64  nfig->bPrefixInd
28d40 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  ex==0 || (flags 
28d50 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
28d60 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b  Y_TEST_NOIDX) ){
28d70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
28d80 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
28d90 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b  _QUERY_PREFIX );
28da0 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b  .      iIdx = 1+
28db0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
28dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
28dd0 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  if.    if( flags
28de0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
28df0 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  RY_PREFIX ){.   
28e00 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66     int nChar = f
28e10 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
28e20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
28e30 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d  .      for(iIdx=
28e40 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  1; iIdx<=pConfig
28e50 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
28e60 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
28e70 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
28e80 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20  [iIdx-1]==nChar 
28e90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
28ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
28eb0 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
28ec0 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
28ed0 2f 2a 20 53 74 72 61 69 67 68 74 20 69 6e 64 65  /* Straight inde
28ee0 78 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20  x lookup */.    
28ef0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
28f00 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
28f10 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
28f20 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20  .      buf.p[0] 
28f30 3d 20 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e  = (u8)(FTS5_MAIN
28f40 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b  _PREFIX + iIdx);
28f50 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 72 75  .      if( pStru
28f60 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ct ){.        ft
28f70 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
28f80 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
28f90 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   | FTS5INDEX_QUE
28fa0 52 59 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20  RY_SKIPEMPTY, . 
28fb0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73             pCols
28fc0 65 74 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65  et, buf.p, nToke
28fd0 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65  n+1, -1, 0, &pRe
28fe0 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  t.        );.   
28ff0 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
29000 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
29010 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
29020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
29030 53 63 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65  Scan multiple te
29040 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rms in the main 
29050 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
29060 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67  nt bDesc = (flag
29070 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
29080 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20  ERY_DESC)!=0;.  
29090 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46      buf.p[0] = F
290a0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b  TS5_MAIN_PREFIX;
290b0 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70  .      fts5Setup
290c0 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44  PrefixIter(p, bD
290d0 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b  esc, buf.p, nTok
290e0 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26  en+1, pColset, &
290f0 70 52 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  pRet);.      ass
29100 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
29110 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70  TE_OK || pRet->p
29120 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Colset==0 );.   
29130 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
29140 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70  tputCb(&p->rc, p
29150 52 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Ret);.      if( 
29160 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
29170 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
29180 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
29190 26 70 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74  &pRet->aSeg[pRet
291a0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
291b0 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st];.        if(
291c0 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70   pSeg->pLeaf ) p
291d0 52 65 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  Ret->xSetOutputs
291e0 28 70 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20  (pRet, pSeg);.  
291f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29200 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
29210 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
29220 74 65 72 43 6c 6f 73 65 28 28 46 74 73 35 49 6e  terClose((Fts5In
29230 64 65 78 49 74 65 72 2a 29 70 52 65 74 29 3b 0a  dexIter*)pRet);.
29240 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
29250 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52        fts5CloseR
29260 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a  eader(p);.    }.
29270 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 26  .    *ppIter = &
29280 70 52 65 74 2d 3e 62 61 73 65 3b 0a 20 20 20 20  pRet->base;.    
29290 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
292a0 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d  rFree(&buf);.  }
292b0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
292c0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
292d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
292e0 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
292f0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
29300 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
29310 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a  s at EOF..*/./*.
29320 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
29330 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
29340 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  id. .*/.int sqli
29350 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
29360 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
29370 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74  IndexIter){.  Ft
29380 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
29390 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
293a0 78 49 74 65 72 3b 0a 20 20 61 73 73 65 72 74 28  xIter;.  assert(
293b0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
293c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
293d0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
293e0 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  Next(pIter->pInd
293f0 65 78 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  ex, pIter, 0, 0)
29400 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
29410 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
29420 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
29430 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
29440 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 74 65  next matching te
29450 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64 20 62  rm/rowid. Used b
29460 79 20 74 68 65 20 66 74 73 35 76 6f 63 61 62 20  y the fts5vocab 
29470 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  module..*/.int s
29480 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
29490 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64 65 78  xtScan(Fts5Index
294a0 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
294b0 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
294c0 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72  Iter = (Fts5Iter
294d0 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20  *)pIndexIter;.  
294e0 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
294f0 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20  Iter->pIndex;.. 
29500 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
29510 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
29520 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74 73 35  TE_OK );..  fts5
29530 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
29540 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20   pIter, 0, 0);. 
29550 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
29560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
29570 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
29580 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
29590 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
295a0 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 66  iFirst ];.    if
295b0 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26  ( pSeg->pLeaf &&
295c0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d   pSeg->term.p[0]
295d0 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  !=FTS5_MAIN_PREF
295e0 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  IX ){.      fts5
295f0 44 61 74 61 52 65 6c 65 61 73 65 28 70 53 65 67  DataRelease(pSeg
29600 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
29610 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  pSeg->pLeaf = 0;
29620 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
29630 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  se.bEof = 1;.   
29640 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
29650 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29660 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
29670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29680 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
29690 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f  ing rowid that o
296a0 63 63 75 72 73 20 61 74 20 6f 72 20 61 66 74 65  ccurs at or afte
296b0 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a  r iMatch. The.**
296c0 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22   definition of "
296d0 61 74 20 6f 72 20 61 66 74 65 72 22 20 64 65 70  at or after" dep
296e0 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
296f0 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74  this iterator it
29700 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63  erates.** in asc
29710 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e  ending or descen
29720 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
29730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29740 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d  Fts5IterNextFrom
29750 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
29760 70 49 6e 64 65 78 49 74 65 72 2c 20 69 36 34 20  pIndexIter, i64 
29770 69 4d 61 74 63 68 29 7b 0a 20 20 46 74 73 35 49  iMatch){.  Fts5I
29780 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74  ter *pIter = (Ft
29790 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
297a0 65 72 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  er;.  fts5MultiI
297b0 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65  terNextFrom(pIte
297c0 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
297d0 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74  , iMatch);.  ret
297e0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
297f0 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
29800 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  x);.}../*.** Ret
29810 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
29820 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  term..*/.const c
29830 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35  har *sqlite3Fts5
29840 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64  IterTerm(Fts5Ind
29850 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74  exIter *pIndexIt
29860 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20  er, int *pn){.  
29870 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
29880 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
29890 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49  char*)fts5MultiI
298a0 74 65 72 54 65 72 6d 28 28 46 74 73 35 49 74 65  terTerm((Fts5Ite
298b0 72 2a 29 70 49 6e 64 65 78 49 74 65 72 2c 20 26  r*)pIndexIter, &
298c0 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b  n);.  *pn = n-1;
298d0 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b  .  return &z[1];
298e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
298f0 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e  an iterator open
29900 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
29910 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
29920 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
29930 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29940 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46  3Fts5IterClose(F
29950 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
29960 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 69 66 28  ndexIter){.  if(
29970 20 70 49 6e 64 65 78 49 74 65 72 20 29 7b 0a 20   pIndexIter ){. 
29980 20 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74     Fts5Iter *pIt
29990 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
299a0 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 20 20  pIndexIter;.    
299b0 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65  Fts5Index *pInde
299c0 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  x = pIter->pInde
299d0 78 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  x;.    fts5Multi
299e0 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
299f0 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65  .    fts5CloseRe
29a00 61 64 65 72 28 70 49 6e 64 65 78 29 3b 0a 20 20  ader(pIndex);.  
29a10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
29a20 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65 20 22  and decode the "
29a30 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
29a40 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
29a50 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  se. .**.** Param
29a60 65 74 65 72 20 61 6e 53 69 7a 65 20 6d 75 73 74  eter anSize must
29a70 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
29a80 61 79 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c  ay of size nCol,
29a90 20 77 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a   where nCol is.*
29aa0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
29ab0 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c  user defined col
29ac0 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20  umns in the FTS 
29ad0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
29ae0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47 65  lite3Fts5IndexGe
29af0 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
29b00 64 65 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52  dex *p, i64 *pnR
29b10 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29  ow, i64 *anSize)
29b20 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  {.  int nCol = p
29b30 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b  ->pConfig->nCol;
29b40 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
29b50 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20  ta;..  *pnRow = 
29b60 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53 69  0;.  memset(anSi
29b70 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 36  ze, 0, sizeof(i6
29b80 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44  4) * nCol);.  pD
29b90 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
29ba0 61 64 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  ad(p, FTS5_AVERA
29bb0 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66  GES_ROWID);.  if
29bc0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
29bd0 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20  OK && pData->nn 
29be0 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  ){.    int i = 0
29bf0 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
29c00 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
29c10 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
29c20 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77  [i], (u64*)pnRow
29c30 29 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  );.    for(iCol=
29c40 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26  0; i<pData->nn &
29c50 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f  & iCol<nCol; iCo
29c60 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d  l++){.      i +=
29c70 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
29c80 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36  pData->p[i], (u6
29c90 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d  4*)&anSize[iCol]
29ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
29cb0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
29cc0 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
29cd0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29ce0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
29cf0 70 6c 61 63 65 20 74 68 65 20 63 75 72 72 65 6e  place the curren
29d00 74 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  t "averages" rec
29d10 6f 72 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ord with the con
29d20 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66  tents of the buf
29d30 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64  fer .** supplied
29d40 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
29d50 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
29d60 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
29d70 53 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35  SetAverages(Fts5
29d80 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20  Index *p, const 
29d90 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
29da0 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28  Data){.  assert(
29db0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
29dc0 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  K );.  fts5DataW
29dd0 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45  rite(p, FTS5_AVE
29de0 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61  RAGES_ROWID, pDa
29df0 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65  ta, nData);.  re
29e00 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
29e10 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
29e20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
29e30 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f  al number of blo
29e40 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  cks this module 
29e50 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  has read from th
29e60 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
29e70 65 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 63  e since it was c
29e80 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  reated..*/.int s
29e90 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
29ea0 65 61 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a  eads(Fts5Index *
29eb0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
29ec0 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nRead;.}../*.** 
29ed0 53 65 74 20 74 68 65 20 33 32 2d 62 69 74 20 63  Set the 32-bit c
29ee0 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72  ookie value stor
29ef0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
29f00 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  of all structure
29f10 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20   .** records to 
29f20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
29f30 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
29f40 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52  rgument..**.** R
29f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
29f60 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
29f70 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
29f80 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
29f90 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  or.** occurs..*/
29fa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
29fb0 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46  IndexSetCookie(F
29fc0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
29fd0 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63   iNew){.  int rc
29fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a000 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2a010 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2a020 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
2a030 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69  fig;    /* Confi
2a040 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  guration object 
2a050 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b  */.  u8 aCookie[
2a060 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
2a070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e            /* Bin
2a080 61 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ary representati
2a090 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20  on of iNew */.  
2a0a0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
2a0b0 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lob = 0;..  asse
2a0c0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
2a0d0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
2a0e0 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b  3Fts5Put32(aCook
2a0f0 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63  ie, iNew);..  rc
2a100 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2a110 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62  open(pConfig->db
2a120 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20  , pConfig->zDb, 
2a130 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20  p->zDataTbl, .  
2a140 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53      "block", FTS
2a150 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
2a160 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29  D, 1, &pBlob.  )
2a170 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2a190 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
2a1a0 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20  pBlob, aCookie, 
2a1b0 34 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  4, 0);.    rc = 
2a1c0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
2a1d0 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a  se(pBlob);.  }..
2a1e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a1f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a200 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46  ndexLoadConfig(F
2a210 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
2a220 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2a230 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63  Struct;.  pStruc
2a240 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
2a250 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35  eRead(p);.  fts5
2a260 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2a270 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  (pStruct);.  ret
2a280 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
2a290 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a  urn(p);.}.../***
2a2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2e0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2a2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a330 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20  *.** Below this 
2a340 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70  point is the imp
2a350 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
2a360 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
2a370 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61  ck .** functiona
2a380 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  lity..*/../*.** 
2a390 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20  Return a simple 
2a3a0 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62  checksum value b
2a3b0 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75  ased on the argu
2a3c0 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71  ments..*/.u64 sq
2a3d0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2a3e0 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20  tryCksum(.  i64 
2a3f0 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69  iRowid, .  int i
2a400 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73  Col, .  int iPos
2a410 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20  , .  int iIdx,. 
2a420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
2a430 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a  rm,.  int nTerm.
2a440 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36  ){.  int i;.  u6
2a450 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a  4 ret = iRowid;.
2a460 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
2a470 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20  ) + iCol;.  ret 
2a480 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50  += (ret<<3) + iP
2a490 6f 73 3b 0a 20 20 69 66 28 20 69 49 64 78 3e 3d  os;.  if( iIdx>=
2a4a0 30 20 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  0 ) ret += (ret<
2a4b0 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e  <3) + (FTS5_MAIN
2a4c0 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b  _PREFIX + iIdx);
2a4d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
2a4e0 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d  erm; i++) ret +=
2a4f0 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72   (ret<<3) + pTer
2a500 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72  m[i];.  return r
2a510 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  et;.}..#ifdef SQ
2a520 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2a530 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2a540 73 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65  s purely an inte
2a550 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f  rnal test. It do
2a560 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
2a570 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e  e to .** FTS fun
2a580 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65  ctionality, or e
2a590 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74  ven the integrit
2a5a0 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20  y-check, in any 
2a5b0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  way..**.** Inste
2a5c0 61 64 2c 20 69 74 20 74 65 73 74 73 20 74 68 61  ad, it tests tha
2a5d0 74 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  t the same set o
2a5e0 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d  f pgno/rowid com
2a5f0 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a  binations are .*
2a600 2a 20 76 69 73 69 74 65 64 20 72 65 67 61 72 64  * visited regard
2a610 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2a620 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
2a630 78 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  x identified by 
2a640 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53  parameters.** iS
2a650 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74  egid/iLeaf is it
2a660 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72  erated in forwar
2a670 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72  ds or reverse or
2a680 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
2a690 6f 69 64 20 66 74 73 35 54 65 73 74 44 6c 69 64  oid fts5TestDlid
2a6a0 78 52 65 76 65 72 73 65 28 0a 20 20 46 74 73 35  xReverse(.  Fts5
2a6b0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74  Index *p, .  int
2a6c0 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a6e0 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f  Segment id to lo
2a6f0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
2a700 20 69 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   iLeaf          
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a720 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64  Load doclist-ind
2a730 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ex for this leaf
2a740 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
2a750 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
2a760 20 30 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31   0;.  u64 cksum1
2a770 20 3d 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73   = 13;.  u64 cks
2a780 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72  um2 = 13;..  for
2a790 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
2a7a0 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20  xIterInit(p, 0, 
2a7b0 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
2a7c0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2a7d0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
2a7e0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
2a7f0 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
2a800 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
2a810 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
2a820 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
2a830 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
2a840 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
2a850 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2a860 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
2a870 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20   pgno>iLeaf );. 
2a880 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f     cksum1 += iRo
2a890 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f  wid + ((i64)pgno
2a8a0 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73  <<32);.  }.  fts
2a8b0 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
2a8c0 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78  Dlidx);.  pDlidx
2a8d0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c   = 0;..  for(pDl
2a8e0 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
2a8f0 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67  rInit(p, 1, iSeg
2a900 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20  id, iLeaf);.    
2a910 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
2a920 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
2a930 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2a940 78 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c  xIterPrev(p, pDl
2a950 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  idx).  ){.    i6
2a960 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44  4 iRowid = fts5D
2a970 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
2a980 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70  lidx);.    int p
2a990 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
2a9a0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
2a9b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
2a9c0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2a9d0 44 6c 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a  Dlidx)>iLeaf );.
2a9e0 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52      cksum2 += iR
2a9f0 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e  owid + ((i64)pgn
2aa00 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74  o<<32);.  }.  ft
2aa10 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
2aa20 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64  pDlidx);.  pDlid
2aa30 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  x = 0;..  if( p-
2aa40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2aa50 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32  & cksum1!=cksum2
2aa60 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2aa70 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74  CORRUPT;.}..stat
2aa80 69 63 20 69 6e 74 20 66 74 73 35 51 75 65 72 79  ic int fts5Query
2aa90 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 49 6e 64  Cksum(.  Fts5Ind
2aaa0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
2aab0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
2aac0 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
2aad0 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63  .  int iIdx,.  c
2aae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ab00 2a 20 49 6e 64 65 78 20 6b 65 79 20 74 6f 20 71  * Index key to q
2ab10 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  uery for */.  in
2ab20 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ab40 20 53 69 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b   Size of index k
2ab50 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ey in bytes */. 
2ab60 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab80 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 46 74   /* Flags for Ft
2ab90 73 35 49 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a  s5IndexQuery */.
2aba0 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 20 20 20    u64 *pCksum   
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abc0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65    /* IN/OUT: Che
2abd0 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29  cksum value */.)
2abe0 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  {.  int eDetail 
2abf0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
2ac00 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73  etail;.  u64 cks
2ac10 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20  um = *pCksum;.  
2ac20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
2ac30 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Iter = 0;.  int 
2ac40 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
2ac50 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a 2c  IndexQuery(p, z,
2ac60 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c 20 26 70   n, flags, 0, &p
2ac70 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28  Iter);..  while(
2ac80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ac90 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  & 0==sqlite3Fts5
2aca0 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 20 29  IterEof(pIter) )
2acb0 7b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  {.    i64 rowid 
2acc0 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b  = pIter->iRowid;
2acd0 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
2ace0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
2acf0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6b 73  ONE ){.      cks
2ad00 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  um ^= sqlite3Fts
2ad10 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2ad20 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20 69 49  (rowid, 0, 0, iI
2ad30 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  dx, z, n);.    }
2ad40 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
2ad50 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 73 52  PoslistReader sR
2ad60 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  eader;.      for
2ad70 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c  (sqlite3Fts5Posl
2ad80 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 70 49  istReaderInit(pI
2ad90 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49 74 65  ter->pData, pIte
2ada0 72 2d 3e 6e 44 61 74 61 2c 20 26 73 52 65 61 64  r->nData, &sRead
2adb0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
2adc0 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a  Reader.bEof==0;.
2add0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ade0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
2adf0 65 72 4e 65 78 74 28 26 73 52 65 61 64 65 72 29  erNext(&sReader)
2ae00 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2ae10 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
2ae20 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65  5_POS2COLUMN(sRe
2ae30 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20  ader.iPos);.    
2ae40 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46      int iOff = F
2ae50 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73  TS5_POS2OFFSET(s
2ae60 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20  Reader.iPos);.  
2ae70 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73        cksum ^= s
2ae80 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
2ae90 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c  ntryCksum(rowid,
2aea0 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64   iCol, iOff, iId
2aeb0 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  x, z, n);.      
2aec0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2aed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2aee0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2aef0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
2af00 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
2af10 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49  }.  sqlite3Fts5I
2af20 74 65 72 43 6c 6f 73 65 28 70 49 74 65 72 29 3b  terClose(pIter);
2af30 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b  ..  *pCksum = ck
2af40 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sum;.  return rc
2af50 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2af60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
2af70 6f 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65  o purely an inte
2af80 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f  rnal test. It do
2af90 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
2afa0 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e  e to .** FTS fun
2afb0 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65  ctionality, or e
2afc0 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74  ven the integrit
2afd0 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20  y-check, in any 
2afe0 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  way..*/.static v
2aff0 6f 69 64 20 66 74 73 35 54 65 73 74 54 65 72 6d  oid fts5TestTerm
2b000 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2b010 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  , .  Fts5Buffer 
2b020 2a 70 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  *pPrev,         
2b030 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
2b040 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74   term */.  const
2b050 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
2b060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b070 73 73 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20  ssibly new term 
2b080 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34  to test */.  u64
2b090 20 65 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34   expected,.  u64
2b0a0 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e   *pCksum.){.  in
2b0b0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
2b0c0 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20  if( pPrev->n==0 
2b0d0 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
2b0e0 72 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c  rSet(&rc, pPrev,
2b0f0 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a   n, (const u8*)z
2b100 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28  );.  }else.  if(
2b110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b120 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c  & (pPrev->n!=n |
2b130 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e  | memcmp(pPrev->
2b140 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20  p, z, n)) ){.   
2b150 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70   u64 cksum3 = *p
2b160 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74  Cksum;.    const
2b170 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28   char *zTerm = (
2b180 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72  const char*)&pPr
2b190 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65  ev->p[1];  /* te
2b1a0 72 6d 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62  rm sans prefix-b
2b1b0 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  yte */.    int n
2b1c0 54 65 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d  Term = pPrev->n-
2b1d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
2b1e0 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
2b1f0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
2b200 6e 74 20 69 49 64 78 20 3d 20 28 70 50 72 65 76  nt iIdx = (pPrev
2b210 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41  ->p[0] - FTS5_MA
2b220 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  IN_PREFIX);.    
2b230 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64  int flags = (iId
2b240 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49  x==0 ? 0 : FTS5I
2b250 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
2b260 58 29 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20  X);.    u64 ck1 
2b270 3d 20 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32  = 0;.    u64 ck2
2b280 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68   = 0;..    /* Ch
2b290 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
2b2a0 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f  ults returned fo
2b2b0 72 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 71  r ASC and DESC q
2b2c0 75 65 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a  ueries are.    *
2b2d0 2a 20 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e  * the same. If n
2b2e0 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f  ot, call this co
2b2f0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2b300 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
2b310 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
2b320 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
2b330 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69  gs, &ck1);.    i
2b340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b350 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20   ){.      int f 
2b360 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45  = flags|FTS5INDE
2b370 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
2b380 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
2b390 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
2b3a0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
2b3b0 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20  , &ck2);.    }. 
2b3c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b3d0 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
2b3e0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
2b3f0 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  RUPT;..    /* If
2b400 20 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69   this is a prefi
2b410 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74  x query, check t
2b420 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
2b430 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a  returned if the.
2b440 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
2b450 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 72 65   is disabled are
2b460 20 74 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f   the same. In bo
2b470 74 68 20 41 53 43 20 61 6e 64 20 44 45 53 43 20  th ASC and DESC 
2b480 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20  order. .    **. 
2b490 20 20 20 2a 2a 20 54 68 69 73 20 63 68 65 63 6b     ** This check
2b4a0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 70 65 72   may only be per
2b4b0 66 6f 72 6d 65 64 20 69 66 20 74 68 65 20 68 61  formed if the ha
2b4c0 73 68 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  sh table is empt
2b4d0 79 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  y. This.    ** i
2b4e0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 68 61  s because the ha
2b4f0 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75  sh table only su
2b500 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c 65 20  pports a single 
2b510 73 63 61 6e 20 71 75 65 72 79 20 61 74 0a 20 20  scan query at.  
2b520 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64    ** a time, and
2b530 20 74 68 65 20 6d 75 6c 74 69 2d 69 74 65 72 20   the multi-iter 
2b540 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69 63 68 20  loop from which 
2b550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2b560 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69   called.    ** i
2b570 73 20 61 6c 72 65 61 64 79 20 70 65 72 66 6f 72  s already perfor
2b580 6d 69 6e 67 20 73 75 63 68 20 61 20 73 63 61 6e  ming such a scan
2b590 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
2b5a0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
2b5b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 49 64  ){.      if( iId
2b5c0 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
2b5d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b5e0 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
2b5f0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
2b600 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20  ST_NOIDX;.      
2b610 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
2b620 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
2b630 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
2b640 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
2b650 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
2b660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b670 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
2b680 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b690 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
2b6a0 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
2b6b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b6c0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2b6d0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
2b6e0 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
2b6f0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
2b700 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20 63  _DESC;.        c
2b710 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  k2 = 0;.        
2b720 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
2b730 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
2b740 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
2b750 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  k2);.        if(
2b760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b770 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
2b780 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2b790 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2b7a0 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31     cksum3 ^= ck1
2b7b0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
2b7c0 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20  Set(&rc, pPrev, 
2b7d0 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29  n, (const u8*)z)
2b7e0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
2b7f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
2b800 6d 33 21 3d 65 78 70 65 63 74 65 64 20 29 7b 0a  m3!=expected ){.
2b810 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
2b820 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
2b830 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73     *pCksum = cks
2b840 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  um3;.  }.  p->rc
2b850 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65   = rc;.}. .#else
2b860 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65  .# define fts5Te
2b870 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 78  stDlidxReverse(x
2b880 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 66  ,y,z).# define f
2b890 74 73 35 54 65 73 74 54 65 72 6d 28 75 2c 76 2c  ts5TestTerm(u,v,
2b8a0 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
2b8b0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2b8c0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c  t:.**.**   1) Al
2b8d0 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67  l leaves of pSeg
2b8e0 20 62 65 74 77 65 65 6e 20 69 46 69 72 73 74 20   between iFirst 
2b8f0 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75  and iLast (inclu
2b900 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a  sive) exist and.
2b910 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
2b920 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  zero terms..**  
2b930 20 32 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f   2) All leaves o
2b940 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69  f pSeg between i
2b950 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69 4c 61 73  NoRowid and iLas
2b960 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78  t (inclusive) ex
2b970 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ist and.**      
2b980 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77  contain zero row
2b990 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ids..*/.static v
2b9a0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
2b9b0 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79  egrityCheckEmpty
2b9c0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2b9d0 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
2b9e0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
2b9f0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
2ba00 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c  o check internal
2ba10 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a   consistency */.
2ba20 20 20 69 6e 74 20 69 46 69 72 73 74 2c 0a 20 20    int iFirst,.  
2ba30 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20  int iNoRowid,.  
2ba40 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69  int iLast.){.  i
2ba50 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  nt i;..  /* Now 
2ba60 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
2ba70 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
2ba80 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
2ba90 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a  current leaf.  *
2baa0 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20  * (a) exist and 
2bab0 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74  (b) contain no t
2bac0 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  erms. */.  for(i
2bad0 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d  =iFirst; p->rc==
2bae0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
2baf0 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  iLast; i++){.   
2bb00 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
2bb10 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
2bb20 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
2bb30 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
2bb40 69 64 2c 20 69 29 29 3b 0a 20 20 20 20 69 66 28  id, i));.    if(
2bb50 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
2bb60 69 66 28 20 21 66 74 73 35 4c 65 61 66 49 73 54  if( !fts5LeafIsT
2bb70 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29  ermless(pLeaf) )
2bb80 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2bb90 52 52 55 50 54 3b 0a 20 20 20 20 20 20 69 66 28  RRUPT;.      if(
2bba0 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20   i>=iNoRowid && 
2bbb0 30 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  0!=fts5LeafFirst
2bbc0 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 20  RowidOff(pLeaf) 
2bbd0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2bbe0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
2bbf0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2bc00 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a  e(pLeaf);.  }.}.
2bc10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2bc20 35 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50  5IntegrityCheckP
2bc30 67 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  gidx(Fts5Index *
2bc40 70 2c 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  p, Fts5Data *pLe
2bc50 61 66 29 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d  af){.  int iTerm
2bc60 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Off = 0;.  int i
2bc70 69 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72  i;..  Fts5Buffer
2bc80 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b   buf1 = {0,0,0};
2bc90 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
2bca0 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20  f2 = {0,0,0};.. 
2bcb0 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c   ii = pLeaf->szL
2bcc0 65 61 66 3b 0a 20 20 77 68 69 6c 65 28 20 69 69  eaf;.  while( ii
2bcd0 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d  <pLeaf->nn && p-
2bce0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
2bcf0 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  {.    int res;. 
2bd00 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
2bd10 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20   int nIncr;..   
2bd20 20 69 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61   ii += fts5GetVa
2bd30 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2bd40 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20  [ii], nIncr);.  
2bd50 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49    iTermOff += nI
2bd60 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  ncr;.    iOff = 
2bd70 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69  iTermOff;..    i
2bd80 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e  f( iOff>=pLeaf->
2bd90 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2bda0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2bdb0 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RUPT;.    }else 
2bdc0 69 66 28 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49  if( iTermOff==nI
2bdd0 6e 63 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ncr ){.      int
2bde0 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f   nByte;.      iO
2bdf0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2be00 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2be10 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
2be20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 6e       if( (iOff+n
2be30 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Byte)>pLeaf->szL
2be40 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
2be50 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2be60 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
2be70 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
2be80 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
2be90 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70  &buf1, nByte, &p
2bea0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Leaf->p[iOff]);.
2beb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2bec0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  e{.      int nKe
2bed0 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  ep, nByte;.     
2bee0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2bef0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
2bf00 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
2bf10 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2bf20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2bf30 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2bf40 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
2bf50 66 28 20 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20  f( nKeep>buf1.n 
2bf60 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e  || (iOff+nByte)>
2bf70 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2bf80 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
2bf90 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2bfa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bfb0 20 20 20 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65      buf1.n = nKe
2bfc0 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ep;.        fts5
2bfd0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
2bfe0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20  (&p->rc, &buf1, 
2bff0 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70  nByte, &pLeaf->p
2c000 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d  [iOff]);.      }
2c010 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ..      if( p->r
2c020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c030 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 66 74          res = ft
2c040 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
2c050 26 62 75 66 31 2c 20 26 62 75 66 32 29 3b 0a 20  &buf1, &buf2);. 
2c060 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 3d         if( res<=
2c070 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
2c080 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c090 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
2c0a0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
2c0b0 2c 20 26 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c  , &buf2, buf1.n,
2c0c0 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20   buf1.p);.  }.. 
2c0d0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2c0e0 26 62 75 66 31 29 3b 0a 20 20 66 74 73 35 42 75  &buf1);.  fts5Bu
2c0f0 66 66 65 72 46 72 65 65 28 26 62 75 66 32 29 3b  fferFree(&buf2);
2c100 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2c110 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
2c120 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a  tyCheckSegment(.
2c130 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
2c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c150 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
2c160 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
2c170 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2c180 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a  nt *pSeg      /*
2c190 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63   Segment to chec
2c1a0 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69  k internal consi
2c1b0 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46  stency */.){.  F
2c1c0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
2c1d0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
2c1e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2c1f0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
2c200 74 20 72 63 32 3b 0a 20 20 69 6e 74 20 69 49 64  t rc2;.  int iId
2c210 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
2c220 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
2c230 20 69 6e 74 20 69 44 6c 69 64 78 50 72 65 76 4c   int iDlidxPrevL
2c240 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
2c250 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65  Last;..  if( pSe
2c260 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
2c270 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73  ) return;..  fts
2c280 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
2c290 74 28 70 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c  t(p, &pStmt, sql
2c2a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2c2b0 20 20 20 20 22 53 45 4c 45 43 54 20 73 65 67 69      "SELECT segi
2c2c0 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e  d, term, (pgno>>
2c2d0 31 29 2c 20 28 70 67 6e 6f 26 31 29 20 46 52 4f  1), (pgno&1) FRO
2c2e0 4d 20 25 51 2e 27 25 71 5f 69 64 78 27 20 57 48  M %Q.'%q_idx' WH
2c2f0 45 52 45 20 73 65 67 69 64 3d 25 64 22 2c 0a 20  ERE segid=%d",. 
2c300 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
2c310 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
2c320 65 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 0a  e, pSeg->iSegid.
2c330 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72    ));..  /* Iter
2c340 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
2c350 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
2c360 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  .  */.  while( p
2c370 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2c380 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
2c390 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2c3a0 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  t) ){.    i64 iR
2c3b0 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
2c3c0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2c3d0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2c3e0 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
2c3f0 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
2c400 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
2c410 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 0a 20 20  this leaf */..  
2c420 20 20 69 6e 74 20 6e 49 64 78 54 65 72 6d 20 3d    int nIdxTerm =
2c430 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c440 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b  bytes(pStmt, 1);
2c450 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2c460 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28 63 6f 6e  *zIdxTerm = (con
2c470 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2c480 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
2c490 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  mt, 1);.    int 
2c4a0 69 49 64 78 4c 65 61 66 20 3d 20 73 71 6c 69 74  iIdxLeaf = sqlit
2c4b0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2c4c0 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74  tmt, 2);.    int
2c4d0 20 62 49 64 78 44 6c 69 64 78 20 3d 20 73 71 6c   bIdxDlidx = sql
2c4e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2c4f0 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20  pStmt, 3);..    
2c500 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69  /* If the leaf i
2c510 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61  n question has a
2c520 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d  lready been trim
2c530 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67  med from the seg
2c540 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67  ment, .    ** ig
2c550 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65  nore this b-tree
2c560 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
2c570 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20  e, load it into 
2c580 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69  memory. */.    i
2c590 66 28 20 69 49 64 78 4c 65 61 66 3c 70 53 65 67  f( iIdxLeaf<pSeg
2c5a0 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f  ->pgnoFirst ) co
2c5b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77  ntinue;.    iRow
2c5c0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2c5d0 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
2c5e0 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
2c5f0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 4c     pLeaf = fts5L
2c600 65 61 66 52 65 61 64 28 70 2c 20 69 52 6f 77 29  eafRead(p, iRow)
2c610 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d  ;.    if( pLeaf=
2c620 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
2c630 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2c640 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73  he leaf contains
2c650 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
2c660 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20  rm, and that it 
2c670 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20  is equal.    ** 
2c680 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61  to or larger tha
2c690 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20  n the split-key 
2c6a0 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20 20 41 6c  in zIdxTerm.  Al
2c6b0 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 69 66  so check that if
2c6c0 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20 69 73   there.    ** is
2c6d0 20 61 6c 73 6f 20 61 20 72 6f 77 69 64 20 70 6f   also a rowid po
2c6e0 69 6e 74 65 72 20 77 69 74 68 69 6e 20 74 68 65  inter within the
2c6f0 20 6c 65 61 66 20 70 61 67 65 20 68 65 61 64 65   leaf page heade
2c700 72 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  r, it points to 
2c710 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61 74 69 6f  a.    ** locatio
2c720 6e 20 62 65 66 6f 72 65 20 74 68 65 20 74 65 72  n before the ter
2c730 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  m.  */.    if( p
2c740 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d  Leaf->nn<=pLeaf-
2c750 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
2c760 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2c770 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
2c780 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
2c790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c7a0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2c7b0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c   first term on l
2c7c0 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  eaf */.      int
2c7d0 20 69 52 6f 77 69 64 4f 66 66 3b 20 20 20 20 20   iRowidOff;     
2c7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2c7f0 65 74 20 6f 66 20 66 69 72 73 74 20 72 6f 77 69  et of first rowi
2c800 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20  d on leaf */.   
2c810 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20     int nTerm;   
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c830 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f  * Size of term o
2c840 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20  n leaf in bytes 
2c850 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  */.      int res
2c860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c870 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
2c880 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73  on of term and s
2c890 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20  plit-key */..   
2c8a0 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65     iOff = fts5Le
2c8b0 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
2c8c0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 52 6f  Leaf);.      iRo
2c8d0 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
2c8e0 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2c8f0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
2c900 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69 4f 66 66   iRowidOff>=iOff
2c910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
2c920 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2c930 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c940 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
2c950 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2c960 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
2c970 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  nTerm);.        
2c980 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c  res = memcmp(&pL
2c990 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49  eaf->p[iOff], zI
2c9a0 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72  dxTerm, MIN(nTer
2c9b0 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20  m, nIdxTerm));. 
2c9c0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d         if( res==
2c9d0 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20  0 ) res = nTerm 
2c9e0 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20  - nIdxTerm;.    
2c9f0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
2ca00 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2ca10 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  RUPT;.      }.. 
2ca20 20 20 20 20 20 66 74 73 35 49 6e 74 65 67 72 69       fts5Integri
2ca30 74 79 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20  tyCheckPgidx(p, 
2ca40 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20  pLeaf);.    }.  
2ca50 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2ca60 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66  e(pLeaf);.    if
2ca70 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
2ca80 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65  ..    /* Now che
2ca90 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
2caa0 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
2cab0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
2cac0 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a  rent leaf.    **
2cad0 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28   (a) exist and (
2cae0 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  b) contain no te
2caf0 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  rms. */.    fts5
2cb00 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2cb10 65 63 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20  eckEmpty(.      
2cb20 20 20 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50    p, pSeg, iIdxP
2cb30 72 65 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64  revLeaf+1, iDlid
2cb40 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64  xPrevLeaf+1, iId
2cb50 78 4c 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20  xLeaf-1.    );. 
2cb60 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
2cb70 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  reak;..    /* If
2cb80 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
2cb90 69 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b  ist-index, check
2cba0 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72   that it looks r
2cbb0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
2cbc0 20 62 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20   bIdxDlidx ){.  
2cbd0 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
2cbe0 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20  r *pDlidx = 0;  
2cbf0 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
2cc00 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74   through doclist
2cc10 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2cc20 69 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20  int iPrevLeaf = 
2cc30 69 49 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20  iIdxLeaf;.      
2cc40 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65  int iSegid = pSe
2cc50 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
2cc60 20 69 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20   int iPg = 0;.  
2cc70 20 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20      i64 iKey;.. 
2cc80 20 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d       for(pDlidx=
2cc90 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
2cca0 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20  t(p, 0, iSegid, 
2ccb0 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20  iIdxLeaf);.     
2ccc0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2ccd0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
2cce0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
2ccf0 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
2cd00 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20  (p, pDlidx).    
2cd10 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    ){..        /*
2cd20 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64   Check any rowid
2cd30 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74  -less pages that
2cd40 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
2cd50 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
2cd60 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
2cd70 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20  Pg=iPrevLeaf+1; 
2cd80 69 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65  iPg<fts5DlidxIte
2cd90 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69  rPgno(pDlidx); i
2cda0 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
2cdb0 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
2cdc0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
2cdd0 64 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  d, iPg);.       
2cde0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
2cdf0 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
2ce00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ce10 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
2ce20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61       if( fts5Lea
2ce30 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2ce40 4c 65 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63  Leaf)!=0 ) p->rc
2ce50 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2ce60 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
2ce70 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2ce80 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  af);.          }
2ce90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cea0 20 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66     iPrevLeaf = f
2ceb0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2cec0 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20  (pDlidx);..     
2ced0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
2cee0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
2cef0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
2cf00 69 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20  iterator really 
2cf10 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  does.        ** 
2cf20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69  contain the rowi
2cf30 64 20 73 75 67 67 65 73 74 65 64 20 62 79 20 74  d suggested by t
2cf40 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  he same. */.    
2cf50 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
2cf60 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
2cf70 65 67 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29  egid, iPrevLeaf)
2cf80 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 20  ;.        pLeaf 
2cf90 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2cfa0 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , iKey);.       
2cfb0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
2cfc0 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77          i64 iRow
2cfd0 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  id;.          in
2cfe0 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74  t iRowidOff = ft
2cff0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2d000 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2d010 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
2d020 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
2d030 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
2d040 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73  widOff>=pLeaf->s
2d050 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
2d060 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2d070 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2d080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d090 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2d0a0 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
2d0b0 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34  iRowidOff], (u64
2d0c0 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  *)&iRowid);.    
2d0d0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
2d0e0 69 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65  id!=fts5DlidxIte
2d0f0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
2d100 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2d110 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2d120 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
2d130 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2d140 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  af);.        }. 
2d150 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44       }..      iD
2d160 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69  lidxPrevLeaf = i
2d170 50 67 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  Pg;.      fts5Dl
2d180 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
2d190 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54  dx);.      fts5T
2d1a0 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
2d1b0 70 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c  p, iSegid, iIdxL
2d1c0 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  eaf);.    }else{
2d1d0 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65  .      iDlidxPre
2d1e0 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
2d1f0 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a  noLast;.      /*
2d200 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65   TODO: Check the
2d210 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74  re is no doclist
2d220 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a   index */.    }.
2d230 0a 20 20 20 20 69 49 64 78 50 72 65 76 4c 65 61  .    iIdxPrevLea
2d240 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
2d250 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74  }..  rc2 = sqlit
2d260 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2d270 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t);.  if( p->rc=
2d280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
2d290 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20  rc = rc2;..  /* 
2d2a0 50 61 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20  Page iter.iLeaf 
2d2b0 6d 75 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20  must now be the 
2d2c0 72 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70  rightmost leaf-p
2d2d0 61 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65  age in the segme
2d2e0 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66  nt */.#if 0.  if
2d2f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2d300 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66  OK && iter.iLeaf
2d310 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  !=pSeg->pgnoLast
2d320 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
2d330 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2d340 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  }.#endif.}.../*.
2d350 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20  ** Run internal 
2d360 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65  checks to ensure
2d370 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e   that the FTS in
2d380 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72  dex (a) is inter
2d390 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73  nally .** consis
2d3a0 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  tent and (b) con
2d3b0 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
2d3c0 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20  r which the XOR 
2d3d0 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  of the checksums
2d3e0 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65  .** as calculate
2d3f0 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35  d by sqlite3Fts5
2d400 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2d410 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a  ) is cksum..**.*
2d420 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2d430 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f  CORRUPT if any o
2d440 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  f the internal c
2d450 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69  hecks fail, or i
2d460 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  f the.** checksu
2d470 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
2d480 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2d490 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73  OK if all checks
2d4a0 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a   pass without.**
2d4b0 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20   error, or some 
2d4c0 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72  other SQLite err
2d4d0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68  or code if anoth
2d4e0 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f  er error (e.g. O
2d4f0 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  OM).** occurs..*
2d500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2d510 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
2d520 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  heck(Fts5Index *
2d530 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20  p, u64 cksum){. 
2d540 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
2d550 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
2d560 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32  il;.  u64 cksum2
2d570 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d580 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2d590 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
2d5a0 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
2d5b0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  /.  Fts5Buffer p
2d5c0 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d  oslist = {0,0,0}
2d5d0 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73  ;   /* Buffer us
2d5e0 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73  ed to hold a pos
2d5f0 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74  list */.  Fts5It
2d600 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  er *pIter;      
2d610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2d620 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2d630 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65  ough entire inde
2d640 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
2d650 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20  ture *pStruct;  
2d660 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2d670 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69  structure */..#i
2d680 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2d690 47 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65  G.  /* Used by e
2d6a0 78 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65  xtra internal te
2d6b0 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20  sts only run if 
2d6c0 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
2d6d0 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63  fined */.  u64 c
2d6e0 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20  ksum3 = 0;      
2d6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2d700 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
2d710 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65  contents of inde
2d720 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  xes */.  Fts5Buf
2d730 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c  fer term = {0,0,
2d740 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66  0};      /* Buff
2d750 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  er used to hold 
2d760 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d  most recent term
2d770 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e   */.#endif.  con
2d780 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
2d790 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
2d7a0 4f 4f 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a  OOUTPUT;.  .  /*
2d7b0 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e   Load the FTS in
2d7c0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
2d7d0 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
2d7e0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
2d7f0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2d800 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
2d810 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
2d820 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
2d830 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28   leaves */.  if(
2d840 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
2d850 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
2d860 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
2d870 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
2d880 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
2d890 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
2d8a0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
2d8b0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
2d8c0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2d8d0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
2d8e0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
2d8f0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
2d900 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
2d910 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49  ];.        fts5I
2d920 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2d930 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  ckSegment(p, pSe
2d940 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2d950 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
2d960 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
2d970 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2d980 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
2d990 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
2d9a0 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
2d9b0 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
2d9c0 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
2d9d0 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
2d9e0 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
2d9f0 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
2da00 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
2da10 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
2da20 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
2da30 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
2da40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
2da50 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
2da60 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
2da70 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
2da80 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
2da90 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
2daa0 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
2dab0 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
2dac0 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
2dad0 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
2dae0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
2daf0 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
2db00 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
2db10 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
2db20 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
2db30 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
2db40 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
2db50 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
2db60 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
2db70 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
2db80 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
2db90 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
2dba0 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
2dbb0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
2dbc0 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
2dbd0 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
2dbe0 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
2dbf0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  s..  */.  for(ft
2dc00 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
2dc10 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
2dc20 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30  , 0, 0, 0, -1, 0
2dc30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
2dc40 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
2dc50 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
2dc60 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
2dc70 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
2dc80 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
2dc90 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dcb0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
2dcc0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34  bytes */.    i64
2dcd0 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20   iPos = 0;      
2dce0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
2dcf0 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70  tion read from p
2dd00 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e  oslist */.    in
2dd10 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20  t iOff = 0;     
2dd20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2dd30 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69  set within posli
2dd40 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52  st */.    i64 iR
2dd50 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
2dd60 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
2dd70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  ;.    char *z = 
2dd80 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69  (char*)fts5Multi
2dd90 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
2dda0 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  &n);..    /* If 
2ddb0 74 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  this is a new te
2ddc0 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74  rm, query for it
2ddd0 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20  . Update cksum3 
2dde0 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73  with the results
2ddf0 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73  . */.    fts5Tes
2de00 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20  tTerm(p, &term, 
2de10 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63  z, n, cksum2, &c
2de20 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28  ksum3);..    if(
2de30 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
2de40 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
2de50 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d      if( 0==fts5M
2de60 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
2de70 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
2de80 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73       cksum2 ^= s
2de90 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
2dea0 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64  ntryCksum(iRowid
2deb0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e  , 0, 0, -1, z, n
2dec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ded0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c  else{.      posl
2dee0 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ist.n = 0;.     
2def0 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
2df00 69 73 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61  ist(p, &pIter->a
2df10 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
2df20 74 5b 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c  t[1].iFirst], 0,
2df30 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   &poslist);.    
2df40 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69    while( 0==sqli
2df50 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
2df60 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20  xt64(poslist.p, 
2df70 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66  poslist.n, &iOff
2df80 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  , &iPos) ){.    
2df90 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
2dfa0 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69  TS5_POS2COLUMN(i
2dfb0 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  Pos);.        in
2dfc0 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35  t iTokOff = FTS5
2dfd0 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73  _POS2OFFSET(iPos
2dfe0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2dff0 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35  2 ^= sqlite3Fts5
2e000 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2e010 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54  iRowid, iCol, iT
2e020 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29  okOff, -1, z, n)
2e030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e040 20 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65    }.  fts5TestTe
2e050 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20  rm(p, &term, 0, 
2e060 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  0, cksum2, &cksu
2e070 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  m3);..  fts5Mult
2e080 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29  iIterFree(pIter)
2e090 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2e0a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
2e0b0 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
2e0c0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2e0d0 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  ;..  fts5Structu
2e0e0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
2e0f0 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
2e100 45 5f 44 45 42 55 47 0a 20 20 66 74 73 35 42 75  E_DEBUG.  fts5Bu
2e110 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
2e120 0a 23 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75  .#endif.  fts5Bu
2e130 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73  fferFree(&poslis
2e140 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
2e150 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
2e160 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
2e170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2e1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
2e200 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
2e210 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2e220 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f  ion of the fts5_
2e230 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a  decode() scalar.
2e240 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ** function only
2e250 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  ..*/../*.** Deco
2e260 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74  de a segment-dat
2e270 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65  a rowid from the
2e280 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
2e290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
2e2a0 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20  ** the opposite 
2e2b0 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45  of macro FTS5_SE
2e2c0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a  GMENT_ROWID()..*
2e2d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2e2e0 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20  s5DecodeRowid(. 
2e2f0 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e310 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25   /* Rowid from %
2e320 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
2e330 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20   int *piSegid,  
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e350 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74   /* OUT: Segment
2e360 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62   id */.  int *pb
2e370 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  Dlidx,          
2e380 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2e390 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20   Dlidx flag */. 
2e3a0 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20   int *piHeight, 
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20   /* OUT: Height 
2e3d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f  */.  int *piPgno
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67       /* OUT: Pag
2e400 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
2e410 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29   *piPgno = (int)
2e420 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2e430 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2e440 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20  PAGE_B) - 1));. 
2e450 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2e460 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20  _DATA_PAGE_B;.. 
2e470 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e   *piHeight = (in
2e480 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
2e490 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
2e4a0 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29  A_HEIGHT_B) - 1)
2e4b0 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
2e4c0 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2e4d0 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20  _B;..  *pbDlidx 
2e4e0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2e4f0 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77   0x0001);.  iRow
2e500 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2e510 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65  _DLI_B;..  *piSe
2e520 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gid = (int)(iRow
2e530 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2e540 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
2e550 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69   - 1));.}..stati
2e560 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
2e570 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20  Rowid(int *pRc, 
2e580 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2e590 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69  , i64 iKey){.  i
2e5a0 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  nt iSegid, iHeig
2e5b0 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64  ht, iPgno, bDlid
2e5c0 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  x;       /* Rowi
2e5d0 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a  d compenents */.
2e5e0 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
2e5f0 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c  d(iKey, &iSegid,
2e600 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
2e610 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
2e620 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
2e630 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46  .    if( iKey==F
2e640 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2e650 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ID ){.      sqli
2e660 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2e670 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2e680 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d  Buf, "{averages}
2e690 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
2e6a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2e6b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2e6c0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2e6d0 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20  {structure}");. 
2e6e0 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b     }.  }.  else{
2e6f0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2e700 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2e710 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
2e720 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20  %ssegid=%d h=%d 
2e730 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20  pgno=%d}",.     
2e740 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69     bDlidx ? "dli
2e750 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69  dx " : "", iSegi
2e760 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
2e770 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
2e780 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2e790 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a  DebugStructure(.
2e7a0 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7c0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2e7d0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2e7e0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2e7f0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
2e800 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  p.){.  int iLvl,
2e810 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
2e820 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2e830 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
2e840 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  , segments */.. 
2e850 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2e860 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  l<p->nLevel; iLv
2e870 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  l++){.    Fts5St
2e880 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
2e890 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  vl = &p->aLevel[
2e8a0 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74  iLvl];.    sqlit
2e8b0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2e8c0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2e8d0 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b  uf, .        " {
2e8e0 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64  lvl=%d nMerge=%d
2e8f0 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c   nSeg=%d", iLvl,
2e900 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70   pLvl->nMerge, p
2e910 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b  Lvl->nSeg.    );
2e920 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
2e930 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
2e940 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2e950 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2e960 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2e970 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
2e980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2e990 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2e9a0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2e9b0 22 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d  " {id=%d leaves=
2e9c0 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20  %d..%d}", .     
2e9d0 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
2e9e0 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  d, pSeg->pgnoFir
2e9f0 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  st, pSeg->pgnoLa
2ea00 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
2ea10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
2ea20 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2ea30 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2ea40 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  }");.  }.}../*.*
2ea50 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f  * This is part o
2ea60 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2ea70 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69  e() debugging ai
2ea80 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
2ea90 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63  ts pBlob/nBlob c
2eaa0 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69  ontain a seriali
2eab0 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72  zed Fts5Structur
2eac0 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a  e object. This.*
2ead0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
2eae0 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2eaf0 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2eb00 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f  on of the same o
2eb10 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20  bject.** to the 
2eb20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73  buffer passed as
2eb30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2eb40 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ment. .*/.static
2eb50 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2eb60 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
2eb70 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb90 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2eba0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2ebb0 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73  er *pBuf,.  cons
2ebc0 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  t u8 *pBlob, int
2ebd0 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20   nBlob.){.  int 
2ebe0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ec00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2ec10 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2ec20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ec30 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63  /* Decoded struc
2ec40 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  ture object */..
2ec50 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63    rc = fts5Struc
2ec60 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62  tureDecode(pBlob
2ec70 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b  , nBlob, 0, &p);
2ec80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2ec90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63  E_OK ){.    *pRc
2eca0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2ecb0 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65  n;.  }..  fts5De
2ecc0 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63  bugStructure(pRc
2ecd0 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74  , pBuf, p);.  ft
2ece0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
2ecf0 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  se(p);.}../*.** 
2ed00 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2ed10 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2ed20 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2ed30 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2ed40 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2ed50 74 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65  tain an "average
2ed60 73 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20  s" record. This 
2ed70 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70  function .** app
2ed80 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
2ed90 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  dable representa
2eda0 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74  tion of record t
2edb0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73  o the buffer pas
2edc0 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73  sed .** as the s
2edd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
2ede0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2edf0 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67  fts5DecodeAverag
2ee00 65 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  es(.  int *pRc, 
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2ee30 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
2ee40 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2ee50 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
2ee60 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
2ee70 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
2ee80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2ee90 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68  pace = "";..  wh
2eea0 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a  ile( i<nBlob ){.
2eeb0 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20      u64 iVal;.  
2eec0 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
2eed0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c  s5GetVarint(&pBl
2eee0 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20  ob[i], &iVal);. 
2eef0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ef00 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ef10 28 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25  (pRc, pBuf, "%s%
2ef20 64 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74  d", zSpace, (int
2ef30 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61  )iVal);.    zSpa
2ef40 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a  ce = " ";.  }.}.
2ef50 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61  ./*.** Buffer (a
2ef60 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74  /n) is assumed t
2ef70 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74  o contain a list
2ef80 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76   of serialized v
2ef90 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20  arints. Read.** 
2efa0 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20  each varint and 
2efb0 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e  append its strin
2efc0 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2efd0 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
2efe0 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72   Return.** after
2eff0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75   either the inpu
2f000 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61  t buffer is exha
2f010 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c  usted or a 0 val
2f020 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ue is read..**.*
2f030 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2f040 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2f050 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66   of bytes read f
2f060 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75  rom the input bu
2f070 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
2f080 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f  int fts5DecodePo
2f090 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20  slist(int *pRc, 
2f0a0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2f0b0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
2f0c0 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66  nt n){.  int iOf
2f0d0 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
2f0e0 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
2f0f0 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66  t iVal;.    iOff
2f100 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2f110 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56  t32(&a[iOff], iV
2f120 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
2f130 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f140 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f150 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a  , " %d", iVal);.
2f160 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66    }.  return iOf
2f170 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
2f180 73 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 20  start of buffer 
2f190 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74  (a/n) contains t
2f1a0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f  he start of a do
2f1b0 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69  clist. The docli
2f1c0 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79  st.** may or may
2f1d0 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68   not finish with
2f1e0 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54  in the buffer. T
2f1f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
2f200 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72  ends a text.** r
2f210 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2f220 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65   the part of the
2f230 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73   doclist that is
2f240 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66   present to buff
2f250 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a  er.** pBuf. .**.
2f260 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2f270 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2f280 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
2f290 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
2f2a0 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
2f2b0 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44   int fts5DecodeD
2f2c0 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oclist(int *pRc,
2f2d0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2f2e0 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
2f2f0 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44  int n){.  i64 iD
2f300 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ocid = 0;.  int 
2f310 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
2f320 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66   n>0 ){.    iOff
2f330 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
2f340 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
2f350 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73  )&iDocid);.    s
2f360 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f370 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f380 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c  , pBuf, " id=%ll
2f390 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d  d", iDocid);.  }
2f3a0 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
2f3b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ){.    int nPos
2f3c0 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a  ;.    int bDel;.
2f3d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2f3e0 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
2f3f0 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  a[iOff], &nPos, 
2f400 26 62 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  &bDel);.    sqli
2f410 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f420 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f430 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73  Buf, " nPos=%d%s
2f440 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a  ", nPos, bDel?"*
2f450 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20  ":"");.    iOff 
2f460 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  += fts5DecodePos
2f470 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20  list(pRc, pBuf, 
2f480 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d  &a[iOff], MIN(n-
2f490 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20  iOff, nPos));.  
2f4a0 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
2f4b0 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
2f4c0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2f4d0 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2f4e0 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
2f4f0 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
2f500 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69       iDocid += i
2f510 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c  Delta;.      sql
2f520 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2f530 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2f540 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2f550 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d  , iDocid);.    }
2f560 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
2f570 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
2f580 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
2f590 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
2f5a0 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
2f5b0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  ng function. It 
2f5c0 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72  is .** only ever
2f5d0 20 75 73 65 64 20 77 69 74 68 20 64 65 74 61 69   used with detai
2f5e0 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a  l=none tables..*
2f5f0 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61  *.** Buffer (pDa
2f600 74 61 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69  ta/nData) contai
2f610 6e 73 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20  ns a doclist in 
2f620 74 68 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20  the format used 
2f630 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a  by detail=none.*
2f640 2a 20 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66  * tables. This f
2f650 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2f660 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2f670 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74   version of that
2f680 20 6c 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66   list to.** buff
2f690 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49  er pBuf..**.** I
2f6a0 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20  f *pRc is other 
2f6b0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77  than SQLITE_OK w
2f6c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2f6d0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
2f6e0 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49  is a.** no-op. I
2f6f0 66 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65  f an OOM or othe
2f700 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  r error occurs w
2f710 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
2f720 69 6f 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20  ion, *pRc is.** 
2f730 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  set to an SQLite
2f740 20 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f   error code befo
2f750 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68  re returning. Th
2f760 65 20 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66  e final state of
2f770 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20   buffer.** pBuf 
2f780 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2f790 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
2f7a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2f7b0 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20  codeRowidList(. 
2f7c0 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7e0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
2f7f0 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2f800 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
2f810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2f820 75 66 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20  uffer to append 
2f830 74 65 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e  text to */.  con
2f840 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
2f850 74 20 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20  t nData      /* 
2f860 44 61 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c  Data to decode l
2f870 69 73 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72  ist-of-rowids fr
2f880 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  om */.){.  int i
2f890 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77   = 0;.  i64 iRow
2f8a0 69 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  id = 0;..  while
2f8b0 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20  ( i<nData ){.   
2f8c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70   const char *zAp
2f8d0 70 20 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20  p = "";.    u64 
2f8e0 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73  iVal;.    i += s
2f8f0 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2f900 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26  int(&pData[i], &
2f910 69 56 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69  iVal);.    iRowi
2f920 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20  d += iVal;..    
2f930 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70  if( i<nData && p
2f940 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b  Data[i]==0x00 ){
2f950 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
2f960 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26    if( i<nData &&
2f970 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20   pData[i]==0x00 
2f980 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ){.        i++;.
2f990 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22          zApp = "
2f9a0 2b 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +";.      }else{
2f9b0 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20  .        zApp = 
2f9c0 22 2a 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "*";.      }.   
2f9d0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
2f9e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2f9f0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2fa00 20 22 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77   " %lld%s", iRow
2fa10 69 64 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d  id, zApp);.  }.}
2fa20 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
2fa30 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73  ementation of us
2fa40 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
2fa50 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f  r function fts5_
2fa60 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61  decode()..*/.sta
2fa70 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2fa80 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  odeFunction(.  s
2fa90 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2faa0 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
2fab0 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
2fac0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
2fad0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2faf0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
2fb00 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
2fb10 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2fb20 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
2fb30 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
2fb40 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  ents */.){.  i64
2fb50 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
2fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb70 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64  Rowid for record
2fb80 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
2fb90 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69  /.  int iSegid,i
2fba0 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c  Height,iPgno,bDl
2fbb0 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d  idx;/* Rowid com
2fbc0 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  ponents */.  con
2fbd0 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e  st u8 *aBlob; in
2fbe0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
2fbf0 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65  Record to decode
2fc00 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b   */.  u8 *a = 0;
2fc10 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b  .  Fts5Buffer s;
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc30 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74     /* Build up t
2fc40 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65  ext to return he
2fc50 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
2fc60 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2fc70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2fc80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2fc90 6e 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e  nSpace = 0;.  in
2fca0 74 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20  t eDetailNone = 
2fcb0 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  (sqlite3_user_da
2fcc0 74 61 28 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20  ta(pCtx)!=0);.. 
2fcd0 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32   assert( nArg==2
2fce0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2fcf0 41 4d 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73  AM(nArg);.  mems
2fd00 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
2fd10 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
2fd20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
2fd30 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
2fd40 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d  Val[0]);..  /* M
2fd50 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2fd60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2fd70 74 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42  t (a blob) in aB
2fd80 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62  lob[]. The aBlob
2fd90 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20  [].  ** copy is 
2fda0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35  followed by FTS5
2fdb0 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
2fdc0 4e 47 20 30 78 30 30 20 62 79 74 65 73 2c 20 77  NG 0x00 bytes, w
2fdd0 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20  hich prevents.  
2fde0 2a 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ** buffer overre
2fdf0 61 64 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  ads even if the 
2fe00 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2fe10 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c  t.  */.  n = sql
2fe20 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2fe30 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42  (apVal[1]);.  aB
2fe40 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
2fe50 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31  lue_blob(apVal[1
2fe60 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e  ]);.  nSpace = n
2fe70 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
2fe80 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d  O_PADDING;.  a =
2fe90 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73   (u8*)sqlite3Fts
2fea0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
2feb0 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
2fec0 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f  a==0 ) goto deco
2fed0 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79  de_out;.  memcpy
2fee0 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a  (a, aBlob, n);..
2fef0 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
2ff00 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67  id(iRowid, &iSeg
2ff10 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
2ff20 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
2ff30 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  .  fts5DebugRowi
2ff40 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69  d(&rc, &s, iRowi
2ff50 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78  d);.  if( bDlidx
2ff60 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
2ff70 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35   dlidx;.    Fts5
2ff80 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20  DlidxLvl lvl;.. 
2ff90 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a     dlidx.p = a;.
2ffa0 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e      dlidx.nn = n
2ffb0 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c  ;..    memset(&l
2ffc0 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
2ffd0 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
2ffe0 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64    lvl.pData = &d
2fff0 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c  lidx;.    lvl.iL
30000 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b  eafPgno = iPgno;
30010 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c  ..    for(fts5Dl
30020 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
30030 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66  ; lvl.bEof==0; f
30040 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
30050 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71  &lvl)){.      sq
30060 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
30070 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
30080 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &s, .          
30090 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c  " %d(%lld)", lvl
300a0 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e  .iLeafPgno, lvl.
300b0 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a  iRowid.      );.
300c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
300d0 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
300e0 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46     if( iRowid==F
300f0 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
30100 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ID ){.      fts5
30110 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 26  DecodeAverages(&
30120 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
30130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30140 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
30150 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
30160 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
30170 65 20 69 66 28 20 65 44 65 74 61 69 6c 4e 6f 6e  e if( eDetailNon
30180 65 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66  e ){.    Fts5Buf
30190 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
301a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
301b0 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d  t term read from
301c0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
301d0 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 6e 74   szLeaf;.    int
301e0 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c   iPgidxOff = szL
301f0 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
30200 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 69 6e 74  (&a[2]);.    int
30210 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 69   iTermOff;.    i
30220 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
30230 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20    int iOff;..   
30240 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
30250 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
30260 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  fer));..    /* D
30270 65 63 6f 64 65 20 61 6e 79 20 65 6e 74 72 69 65  ecode any entrie
30280 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
30290 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 74 65  ore the first te
302a0 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  rm. */.    if( s
302b0 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20 20 20 20  zLeaf<n ){.     
302c0 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
302d0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
302e0 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65  [iPgidxOff], iTe
302f0 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73  rmOff);.    }els
30300 65 7b 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66  e{.      iTermOf
30310 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  f = szLeaf;.    
30320 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65  }.    fts5Decode
30330 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26  RowidList(&rc, &
30340 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65 72 6d 4f  s, &a[4], iTermO
30350 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69 4f 66 66  ff-4);..    iOff
30360 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
30370 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c   while( iOff<szL
30380 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eaf ){.      int
30390 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20   nAppend;..     
303a0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 65 72   /* Read the ter
303b0 6d 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e  m data for the n
303c0 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20 20 20 20  ext term*/.     
303d0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
303e0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
303f0 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20  ], nAppend);.   
30400 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65     term.n = nKee
30410 70 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  p;.      fts5Buf
30420 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
30430 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70 70 65 6e  c, &term, nAppen
30440 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  d, &a[iOff]);.  
30450 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
30460 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
30470 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72 63  f(.          &rc
30480 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a  , &s, " term=%.*
30490 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e  s", term.n, (con
304a0 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a  st char*)term.p.
304b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
304c0 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a  Off += nAppend;.
304d0 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
304e0 20 6f 75 74 20 77 68 65 72 65 20 74 68 65 20 64   out where the d
304f0 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  oclist for this 
30500 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a 20 20 20  term ends */.   
30510 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66     if( iPgidxOff
30520 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  <n ){.        in
30530 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 20  t nIncr;.       
30540 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
30550 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30560 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 49 6e  [iPgidxOff], nIn
30570 63 72 29 3b 0a 20 20 20 20 20 20 20 20 69 54 65  cr);.        iTe
30580 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a  rmOff += nIncr;.
30590 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
305a0 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
305b0 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a  szLeaf;.      }.
305c0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
305d0 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20  eRowidList(&rc, 
305e0 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54  &s, &a[iOff], iT
305f0 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20  ermOff-iOff);.  
30600 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
30610 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Off;.      if( i
30620 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20  Off<szLeaf ){.  
30630 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
30640 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30650 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
30660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
30670 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
30680 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  e(&term);.  }els
30690 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  e{.    Fts5Buffe
306a0 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
306b0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
306c0 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
306d0 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
306e0 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  zLeaf;          
306f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
30700 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61  et of pgidx in a
30710 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50  [] */.    int iP
30720 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74  gidxOff;.    int
30730 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b   iPgidxPrev = 0;
30740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
30750 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61  evious value rea
30760 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a  d from pgidx */.
30770 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
30780 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52   = 0;.    int iR
30790 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
307a0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
307b0 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20  nt nDoclist;..  
307c0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
307d0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
307e0 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
307f0 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71   n<4 ){.      sq
30800 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
30810 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28  et(&rc, &s, 7, (
30820 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75  const u8*)"corru
30830 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pt");.      goto
30840 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
30850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
30860 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
30870 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
30880 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73     iPgidxOff = s
30890 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
308a0 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20  16(&a[2]);.     
308b0 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
308c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
308d0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
308e0 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
308f0 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Off);.      }.  
30900 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
30910 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  de the position 
30920 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65  list tail at the
30930 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
30940 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52  ge */.    if( iR
30950 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20  owidOff!=0 ){.  
30960 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69      iOff = iRowi
30970 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20  dOff;.    }else 
30980 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20  if( iTermOff!=0 
30990 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
309a0 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65  iTermOff;.    }e
309b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
309c0 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
309d0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
309e0 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
309f0 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
30a00 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e      /* Decode an
30a10 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64  y more doclist d
30a20 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
30a30 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65 66   on the page bef
30a40 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66  ore the.    ** f
30a50 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
30a60 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54    nDoclist = (iT
30a70 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66  ermOff ? iTermOf
30a80 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f  f : szLeaf) - iO
30a90 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f  ff;.    fts5Deco
30aa0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
30ab0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f  s, &a[iOff], nDo
30ac0 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69  clist);..    whi
30ad0 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  le( iPgidxOff<n 
30ae0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  ){.      int bFi
30af0 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66  rst = (iPgidxOff
30b00 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f  ==szLeaf);     /
30b10 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
30b20 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
30b30 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
30b40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b60 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
30b70 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b  .      int iEnd;
30b80 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50  .      .      iP
30b90 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
30ba0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
30bb0 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
30bc0 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72  ;.      iPgidxPr
30bd0 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ev += nByte;.   
30be0 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78     iOff = iPgidx
30bf0 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28  Prev;..      if(
30c00 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
30c10 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
30c20 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
30c30 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
30c40 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50         iEnd = iP
30c50 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65  gidxPrev + nByte
30c60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30c70 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a         iEnd = sz
30c80 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
30c90 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
30ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  =0 ){.        iO
30cb0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
30cc0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
30cd0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
30ce0 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a  term.n = nByte;.
30cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
30d00 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
30d10 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
30d20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74  nByte);.      ft
30d30 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
30d40 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
30d50 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
30d60 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
30d70 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Byte;..      sql
30d80 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
30d90 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
30da0 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
30db0 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
30dc0 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
30dd0 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
30de0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
30df0 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
30e00 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
30e10 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b  ff], iEnd-iOff);
30e20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
30e30 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
30e40 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64  );.  }.  . decod
30e50 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
30e60 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
30e70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30e80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
30e90 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
30ea0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
30eb0 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
30ec0 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
30ed0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
30ee0 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
30ef0 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
30f00 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
30f10 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
30f20 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
30f30 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
30f40 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
30f50 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
30f60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
30f70 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
30f80 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
30f90 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
30fa0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
30fb0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
30fc0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
30ff0 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
31000 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
31010 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
31020 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
31030 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
31040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
31050 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
31060 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31070 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
31080 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
31090 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
310a0 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
310b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
310c0 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
310d0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
310e0 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
310f0 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
31100 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
31110 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
31120 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
31130 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c        int segid,
31140 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
31150 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
31160 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31170 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
31180 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
31190 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
311a0 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
311b0 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  gid, pgno))", -1
311c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
311d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
311e0 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
311f0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
31200 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [1]);.        pg
31210 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
31220 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
31230 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
31240 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
31250 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e  ROWID(segid, pgn
31260 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
31270 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
31280 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
31290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
312a0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
312b0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
312c0 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
312d0 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
312e0 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
312f0 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a  'segment'" , -1.
31300 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
31310 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
31320 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
31330 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
31340 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
31350 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
31360 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
31370 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
31380 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
31390 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
313a0 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
313b0 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
313c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
313d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
313e0 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
313f0 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
31400 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
31410 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31420 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
31430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
31440 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
31450 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
31460 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
31470 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
31480 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
31490 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
314a0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
314b0 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
314c0 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  0.  );..  if( rc
314d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
314e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
314f0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
31500 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
31510 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c  s5_decode_none",
31520 20 32 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c   2, .        SQL
31530 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
31540 29 64 62 2c 20 66 74 73 35 44 65 63 6f 64 65 46  )db, fts5DecodeF
31550 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
31560 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
31570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31580 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31590 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
315a0 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  n(.        db, "
315b0 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c  fts5_rowid", -1,
315c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
315d0 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
315e0 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  on, 0, 0.    );.
315f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
31600 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
31610 46 74 73 35 49 6e 64 65 78 52 65 73 65 74 28 46  Fts5IndexReset(F
31620 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
31630 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75  assert( p->pStru
31640 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72  ct==0 || p->iStr
31650 75 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b  uctVersion!=0 );
31660 0a 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78  .  if( fts5Index
31670 44 61 74 61 56 65 72 73 69 6f 6e 28 70 29 21 3d  DataVersion(p)!=
31680 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f  p->iStructVersio
31690 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72  n ){.    fts5Str
316a0 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
316b0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
316c0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
316d0 6e 28 70 29 3b 0a 7d 0a                          n(p);.}.