/ Hex Artifact Content
Login

Artifact ddaea9e164670f4c2d97441da9b11499718114a8920f49f1982eb6a6c06863fa:


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 33 28 70 2d 3e 70 43 6f 6e 66 69 67  re_v3(p->pConfig
6580: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a  ->db, zSql, -1,.
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50  SQLITE_PREPARE_P
65c0: 45 52 53 49 53 54 45 4e 54 7c 53 51 4c 49 54 45  ERSISTENT|SQLITE
65d0: 5f 50 52 45 50 41 52 45 5f 53 48 41 44 4f 57 2c  _PREPARE_SHADOW,
65e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   ppStmt, 0);.   
6610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
6620: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
6630: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
6640: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
6650: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  l);.  return p->
6660: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e  rc;.}.../*.** IN
6670: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
6680: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  a record into th
6690: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
66a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
66b0: 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74 73  ts5DataWrite(Fts
66c0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
66d0: 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20  Rowid, const u8 
66e0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
66f0: 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  a){.  if( p->rc!
6700: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6710: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  urn;..  if( p->p
6720: 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
6730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6740: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6750: 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
6760: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
6770: 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c 69  p->pWriter, sqli
6780: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
6790: 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20         "REPLACE 
67a0: 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64 61  INTO '%q'.'%q_da
67b0: 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56  ta'(id, block) V
67c0: 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20  ALUES(?,?)", .  
67d0: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
67e0: 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
67f0: 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 20  Name.    ));.   
6800: 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
6810: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  urn;.  }..  sqli
6820: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6830: 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52  ->pWriter, 1, iR
6840: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
6850: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57  _bind_blob(p->pW
6860: 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c  riter, 2, pData,
6870: 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53   nData, SQLITE_S
6880: 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
6890: 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65  3_step(p->pWrite
68a0: 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  r);.  p->rc = sq
68b0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
68c0: 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Writer);.  sqlit
68d0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e  e3_bind_null(p->
68e0: 70 57 72 69 74 65 72 2c 20 32 29 3b 0a 7d 0a 0a  pWriter, 2);.}..
68f0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68  /*.** Execute th
6900: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a  e following SQL:
6910: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54  .**.**     DELET
6920: 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48  E FROM %_data WH
6930: 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20 24  ERE id BETWEEN $
6940: 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73  iFirst AND $iLas
6950: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
6960: 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
6970: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
6980: 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c  4 iFirst, i64 iL
6990: 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ast){.  if( p->r
69a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
69b0: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
69c0: 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a  >pDeleter==0 ){.
69d0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
69e0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
69f0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
6a00: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
6a10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
6a20: 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c  tf(.        "DEL
6a30: 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  ETE FROM '%q'.'%
6a40: 71 5f 64 61 74 61 27 20 57 48 45 52 45 20 69 64  q_data' WHERE id
6a50: 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20  >=? AND id<=?", 
6a60: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
6a70: 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
6a80: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
6a90: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
6aa0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6ab0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
6ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
6ad0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6ae0: 5f 76 33 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v3(pConfig->db,
6af0: 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20 20 20 20 20   zSql, -1,.     
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6b20: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
6b30: 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  NT|SQLITE_PREPAR
6b40: 45 5f 53 48 41 44 4f 57 2c 0a 20 20 20 20 20 20  E_SHADOW,.      
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 20 20 26 70 2d 3e 70 44 65 6c          &p->pDel
6b70: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
6b80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
6b90: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
6ba0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6bb0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
6bc0: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
6bd0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
6be0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6bf0: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
6c00: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
6c10: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
6c20: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
6c30: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
6c40: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
6c50: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
6c60: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
6c70: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
6c80: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
6c90: 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74  records associat
6ca0: 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20  ed with segment 
6cb0: 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69  iSegid..*/.stati
6cc0: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6cd0: 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73  emoveSegment(Fts
6ce0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
6cf0: 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46  Segid){.  i64 iF
6d00: 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  irst = FTS5_SEGM
6d10: 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
6d20: 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73  , 0);.  i64 iLas
6d30: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
6d40: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c  _ROWID(iSegid+1,
6d50: 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74   0)-1;.  fts5Dat
6d60: 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73  aDelete(p, iFirs
6d70: 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69 66 28  t, iLast);.  if(
6d80: 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 3d   p->pIdxDeleter=
6d90: 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
6da0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6db0: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6dc0: 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
6dd0: 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
6de0: 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74 65 33  Deleter, sqlite3
6df0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6e00: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6e10: 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
6e20: 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20  HERE segid=?",. 
6e30: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6e40: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6e50: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
6e60: 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
6e70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6e80: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6e90: 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c  (p->pIdxDeleter,
6ea0: 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20   1, iSegid);.   
6eb0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
6ec0: 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
6ed0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
6ee0: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
6ef0: 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  Deleter);.  }.}.
6f00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6f10: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
6f20: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
6f30: 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62  bject returned b
6f40: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a  y an earlier .**
6f50: 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72   call to fts5Str
6f60: 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20  uctureRead() or 
6f70: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
6f80: 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
6f90: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6fa0: 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53  ureRelease(Fts5S
6fb0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
6fc0: 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63  t){.  if( pStruc
6fd0: 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75  t && 0>=(--pStru
6fe0: 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20  ct->nRef) ){.   
6ff0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
7000: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  rt( pStruct->nRe
7010: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  f==0 );.    for(
7020: 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
7030: 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
7040: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7050: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
7060: 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d  [i].aSeg);.    }
7070: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7080: 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
7090: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
70a0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
70b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
70c0: 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74 72 75  Struct){.  pStru
70d0: 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f  ct->nRef++;.}../
70e0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
70f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
7100: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
7110: 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
7120: 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a  d in serialized.
7130: 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62  ** form within b
7140: 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74  uffer pData/nDat
7150: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  a..**.** The Fts
7160: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
7170: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
7180: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
7190: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
71a0: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
71b0: 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20  ed by one slot. 
71c0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
71d0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e  structure conten
71e0: 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65  ts.** to be more
71f0: 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a   easily edited..
7200: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
7210: 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74  r occurs, *ppOut
7220: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
7230: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
7240: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75  ror code.** retu
7250: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
7260: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7270: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
7280: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a  ew object and.**
7290: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
72a0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
72b0: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
72c0: 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  Decode(.  const 
72d0: 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  u8 *pData,      
72e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
72f0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  fer containing s
7300: 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74  erialized struct
7310: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ure */.  int nDa
7320: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7330: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
7340: 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61   of buffer pData
7350: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
7360: 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20  nt *piCookie,   
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7380: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
7390: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
73a0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
73b0: 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
73c0: 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69    /* OUT: Deseri
73d0: 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f  alized object */
73e0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
73f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
7400: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76  i = 0;.  int iLv
7410: 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  l;.  int nLevel 
7420: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  = 0;.  int nSegm
7430: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ent = 0;.  int n
7440: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
7450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7460: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
7470: 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74  allocate at pRet
7480: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
7490: 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  ure *pRet = 0;  
74a0: 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
74b0: 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  re object to ret
74c0: 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61  urn */..  /* Gra
74d0: 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  b the cookie val
74e0: 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f  ue */.  if( piCo
74f0: 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65  okie ) *piCookie
7500: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
7510: 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20  t32(pData);.  i 
7520: 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  = 4;..  /* Read 
7530: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7540: 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73   of levels and s
7550: 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
7560: 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20   start of the.  
7570: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ** structure rec
7580: 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20  ord.  */.  i += 
7590: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
75a0: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65  &pData[i], nLeve
75b0: 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47  l);.  i += fts5G
75c0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
75d0: 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  a[i], nSegment);
75e0: 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  .  nByte = (.   
75f0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7600: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7620: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
7630: 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
7640: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7650: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29  el) * (nLevel-1)
7660: 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20      /* aLevel[] 
7670: 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20  array */.  );.  
7680: 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72 75  pRet = (Fts5Stru
7690: 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74  cture*)sqlite3Ft
76a0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
76b0: 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28  , nByte);..  if(
76c0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65   pRet ){.    pRe
76d0: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
76e0: 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pRet->nLevel = 
76f0: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74  nLevel;.    pRet
7700: 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65  ->nSegment = nSe
7710: 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20  gment;.    i += 
7720: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
7730: 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20  rint(&pData[i], 
7740: 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75  &pRet->nWriteCou
7750: 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nter);..    for(
7760: 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iLvl=0; rc==SQLI
7770: 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c  TE_OK && iLvl<nL
7780: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
7790: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
77a0: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
77b0: 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  &pRet->aLevel[iL
77c0: 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  vl];.      int n
77d0: 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  Total = 0;.     
77e0: 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20   int iSeg;..    
77f0: 20 20 69 66 28 20 69 3e 3d 6e 44 61 74 61 20 29    if( i>=nData )
7800: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 46  {.        rc = F
7810: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
7820: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7830: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7840: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7850: 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b  , pLvl->nMerge);
7860: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74  .        i += ft
7870: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7880: 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29  Data[i], nTotal)
7890: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
78a0: 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e  ( nTotal>=pLvl->
78b0: 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20  nMerge );.      
78c0: 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
78d0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
78e0: 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
78f0: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
7900: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 54   .            nT
7910: 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74  otal * sizeof(Ft
7920: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7930: 6e 74 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  nt).        );. 
7940: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
7950: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7960: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  ){.        pLvl-
7970: 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a  >nSeg = nTotal;.
7980: 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
7990: 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b  =0; iSeg<nTotal;
79a0: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
79b0: 20 20 20 20 69 66 28 20 69 3e 3d 6e 44 61 74 61      if( i>=nData
79c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
79d0: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
79e0: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  T;.            b
79f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7a00: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  }.          i +=
7a10: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7a20: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
7a30: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
7a40: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gid);.          
7a50: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7a60: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7a70: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7a80: 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20  .pgnoFirst);.   
7a90: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7aa0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7ab0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7ac0: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74  g[iSeg].pgnoLast
7ad0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7ae0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7af0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7b00: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
7b10: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
7b20: 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74  Ret);.      pRet
7b30: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
7b40: 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74  .  *ppOut = pRet
7b50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7b60: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
7b70: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
7b80: 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74  tureAddLevel(int
7b90: 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63   *pRc, Fts5Struc
7ba0: 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29  ture **ppStruct)
7bb0: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
7bc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
7bd0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
7be0: 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
7bf0: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65  t;.    int nLeve
7c00: 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  l = pStruct->nLe
7c10: 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  vel;.    int nBy
7c20: 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73  te = (.        s
7c30: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7c40: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
7c50: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20          /* Main 
7c60: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7c70: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7c80: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
7c90: 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a  * (nLevel+1)  /*
7ca0: 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20   aLevel[] array 
7cb0: 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70  */.    );..    p
7cc0: 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33  Struct = sqlite3
7cd0: 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74  _realloc(pStruct
7ce0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
7cf0: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
7d00: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75     memset(&pStru
7d10: 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65  ct->aLevel[nLeve
7d20: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  l], 0, sizeof(Ft
7d30: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7d40: 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  ));.      pStruc
7d50: 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20  t->nLevel++;.   
7d60: 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70     *ppStruct = p
7d70: 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73  Struct;.    }els
7d80: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
7d90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7da0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7db0: 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c   Extend level iL
7dc0: 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  vl so that there
7dd0: 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20   is room for at 
7de0: 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72  least nExtra mor
7df0: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e.** segments..*
7e00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7e10: 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
7e20: 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70  dLevel(.  int *p
7e30: 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  Rc, .  Fts5Struc
7e40: 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a  ture *pStruct, .
7e50: 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69    int iLvl, .  i
7e60: 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e  nt nExtra, .  in
7e70: 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69  t bInsert.){.  i
7e80: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
7e90: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
7ea0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
7eb0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
7ec0: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7ed0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
7ee0: 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20  gment *aNew;.   
7ef0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20   int nByte;..   
7f00: 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e   nByte = (pLvl->
7f10: 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a  nSeg + nExtra) *
7f20: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7f30: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
7f40: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
7f50: 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e  3_realloc(pLvl->
7f60: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
7f70: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
7f80: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
7f90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
7fa0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
7fb0: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 0, sizeo
7fc0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7fd0: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
7fe0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7ff0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
8000: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
8010: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8020: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
8030: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
8040: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
8050: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
8060: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
8070: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
8080: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8090: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
80a0: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
80b0: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
80c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
80d0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
80e0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
80f0: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
8100: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
8110: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
8120: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
8130: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8140: 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35  pRet = 0;.  Fts5
8150: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8160: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
8170: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
81a0: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
81b0: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
81c0: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
81d0: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
81e0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
81f0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8200: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
8210: 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65   TODO: Do we nee
8220: 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65  d this if the le
8230: 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65  af-index is appe
8240: 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e  nded? Probably..
8250: 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  . */.    memset(
8260: 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d  &pData->p[pData-
8270: 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41  >nn], 0, FTS5_DA
8280: 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20  TA_PADDING);.   
8290: 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74 72   p->rc = fts5Str
82a0: 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44 61  uctureDecode(pDa
82b0: 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e  ta->p, pData->nn
82c0: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
82d0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  t);.    if( p->r
82e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
82f0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
8300: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
8310: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
8320: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
8330: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
8340: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  e);.    }.    ft
8350: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
8360: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ata);.    if( p-
8370: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
8380: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
8390: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
83a0: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
83b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
83c0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
83d0: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
83e0: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
83f0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
8400: 20 20 69 36 34 20 69 56 65 72 73 69 6f 6e 20 3d    i64 iVersion =
8410: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
8420: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8430: 20 20 20 69 66 28 20 70 2d 3e 70 44 61 74 61 56     if( p->pDataV
8440: 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  ersion==0 ){.   
8450: 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 49     p->rc = fts5I
8460: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
8470: 70 2c 20 26 70 2d 3e 70 44 61 74 61 56 65 72 73  p, &p->pDataVers
8480: 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ion, .          
8490: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
84a0: 22 50 52 41 47 4d 41 20 25 51 2e 64 61 74 61 5f  "PRAGMA %Q.data_
84b0: 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f  version", p->pCo
84c0: 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20 20  nfig->zDb).     
84d0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
84e0: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
84f0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
8500: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
8510: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
8520: 44 61 74 61 56 65 72 73 69 6f 6e 29 20 29 7b 0a  DataVersion) ){.
8530: 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d        iVersion =
8540: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8550: 69 6e 74 36 34 28 70 2d 3e 70 44 61 74 61 56 65  int64(p->pDataVe
8560: 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 7d  rsion, 0);.    }
8570: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
8580: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
8590: 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 7d  ataVersion);.  }
85a0: 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72 73  ..  return iVers
85b0: 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ion;.}../*.** Re
85c0: 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20  ad, deserialize 
85d0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
85e0: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
85f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
8600: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
8610: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
8620: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
8630: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
8640: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
8650: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f   as described fo
8660: 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53  r function fts5S
8670: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
8680: 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a   .** above..**.*
8690: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
86a0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
86b0: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
86c0: 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
86d0: 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65   the.** Fts5Inde
86e0: 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20  x handle. If an 
86f0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
8700: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
8710: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
8720: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
8730: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
8740: 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
8750: 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72  re *fts5Structur
8760: 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  eRead(Fts5Index 
8770: 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  *p){..  if( p->p
8780: 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Struct==0 ){.   
8790: 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69   p->iStructVersi
87a0: 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61  on = fts5IndexDa
87b0: 74 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20  taVersion(p);.  
87c0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
87d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
87e0: 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73  p->pStruct = fts
87f0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
8800: 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20 7d  cached(p);.    }
8810: 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65 6c  .  }..#if 0.  el
8820: 73 65 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  se{.    Fts5Stru
8830: 63 74 75 72 65 20 2a 70 54 65 73 74 20 3d 20 66  cture *pTest = f
8840: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8850: 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20  Uncached(p);.   
8860: 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a 20 20   if( pTest ){.  
8870: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
8880: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8890: 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ->pStruct->nSegm
88a0: 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65 67  ent==pTest->nSeg
88b0: 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ment );.      as
88c0: 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72  sert_nc( p->pStr
88d0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65  uct->nLevel==pTe
88e0: 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  st->nLevel );.  
88f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8900: 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Test->nLevel; i+
8910: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
8920: 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63  rt_nc( p->pStruc
8930: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
8940: 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76  rge==pTest->aLev
8950: 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a  el[i].nMerge );.
8960: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8970: 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  c( p->pStruct->a
8980: 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70  Level[i].nSeg==p
8990: 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  Test->aLevel[i].
89a0: 6e 53 65 67 20 29 3b 0a 20 20 20 20 20 20 20 20  nSeg );.        
89b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73 74  for(j=0; j<pTest
89c0: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
89d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
89e0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
89f0: 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70 54  egment *p1 = &pT
8a00: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  est->aLevel[i].a
8a10: 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  Seg[j];.        
8a20: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8a30: 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 2d  egment *p2 = &p-
8a40: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8a50: 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20  [i].aSeg[j];.   
8a60: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8a70: 28 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70 32  ( p1->iSegid==p2
8a80: 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ->iSegid );.    
8a90: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8aa0: 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d   p1->pgnoFirst==
8ab0: 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b  p2->pgnoFirst );
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8ad0: 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61  t_nc( p1->pgnoLa
8ae0: 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74  st==p2->pgnoLast
8af0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
8b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
8b10: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
8b20: 28 70 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20  (pTest);.    }. 
8b30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
8b40: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
8b50: 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  K ) return 0;.  
8b60: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 72 75  assert( p->iStru
8b70: 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a  ctVersion!=0 );.
8b80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74    assert( p->pSt
8b90: 72 75 63 74 21 3d 30 20 29 3b 0a 20 20 66 74 73  ruct!=0 );.  fts
8ba0: 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 2d  5StructureRef(p-
8bb0: 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  >pStruct);.  ret
8bc0: 75 72 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b 0a  urn p->pStruct;.
8bd0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
8be0: 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
8bf0: 6c 69 64 61 74 65 28 46 74 73 35 49 6e 64 65 78  lidate(Fts5Index
8c00: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
8c10: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74  Struct ){.    ft
8c20: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8c30: 73 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a  se(p->pStruct);.
8c40: 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d      p->pStruct =
8c50: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8c60: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
8c70: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
8c80: 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74  ents in index st
8c90: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
8ca0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8cb0: 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  n is only ever u
8cc0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
8cd0: 73 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f  ssert() conditio
8ce0: 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ns..*/.#ifdef SQ
8cf0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
8d00: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
8d10: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
8d20: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a  (Fts5Structure *
8d30: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
8d40: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20  nSegment = 0;   
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8d60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8d70: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28  egments */.  if(
8d80: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
8d90: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8db0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8dc0: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
8dd0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  */.    for(iLvl=
8de0: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
8df0: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
8e00: 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74  {.      nSegment
8e10: 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   += pStruct->aLe
8e20: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
8e30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8e40: 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a  urn nSegment;.}.
8e50: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8e60: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
8e70: 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
8e80: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20  Blob, nBlob) {  
8e90: 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
8ea0: 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28  pBuf)->nSpace>=(
8eb0: 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29  (pBuf)->n+nBlob)
8ec0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
8ed0: 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75  \.  memcpy(&(pBu
8ee0: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
8ef0: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8f10: 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42   (pBuf)->n += nB
8f20: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
8f50: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
8f60: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
8f70: 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20  t(pBuf, iVal) { 
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8f90: 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20  .  (pBuf)->n += 
8fa0: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
8fb0: 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b  rint(&(pBuf)->p[
8fc0: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61  (pBuf)->n], (iVa
8fd0: 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74  l));  \.  assert
8fe0: 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
8ff0: 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20  >=(pBuf)->n );  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a          \.}.../*
9020: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
9030: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
9040: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a  ucture" record..
9050: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
9060: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
9070: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
9080: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
9090: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
90a0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
90b0: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
90c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
90d0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
90e0: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
90f0: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
9100: 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
9110: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
9120: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9130: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
9140: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
9150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9160: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
9170: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
9180: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
91b0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
91c0: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
91d0: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
91e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
91f0: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
9200: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
9210: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
9220: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
9230: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
9240: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
9250: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9260: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
9270: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
9280: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
9290: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
92a0: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
92b0: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
92c0: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
92d0: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
92e0: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20  iCookie = 0;..  
92f0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
9300: 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
9310: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39  p->rc, &buf, 4+9
9320: 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73  +9+9) ){.      s
9330: 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
9340: 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b  buf.p, iCookie);
9350: 0a 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34  .      buf.n = 4
9360: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9370: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
9380: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
9390: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  ->nLevel);.     
93a0: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
93b0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
93c0: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
93d0: 65 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ent);.      fts5
93e0: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
93f0: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36  Varint(&buf, (i6
9400: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
9410: 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d  eCounter);.    }
9420: 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ..    for(iLvl=0
9430: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
9440: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
9450: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
9480: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
9490: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
94a0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
94b0: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
94c0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
94d0: 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42  vl];.      fts5B
94e0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
94f0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9500: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
9510: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
9520: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9530: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
9540: 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73  nSeg);.      ass
9550: 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
9560: 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
9570: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ..      for(iSeg
9580: 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
9590: 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
95a0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
95b0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
95c0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
95d0: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
95e0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
95f0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
9600: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
9610: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
9620: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
9630: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
9640: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9650: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9660: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
9670: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  oLast);.      }.
9680: 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44      }..    fts5D
9690: 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
96a0: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
96b0: 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
96c0: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
96d0: 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d  ree(&buf);.  }.}
96e0: 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76  ..#if 0.static v
96f0: 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
9700: 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35  ucture(int*,Fts5
9710: 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75  Buffer*,Fts5Stru
9720: 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20  cture*);.static 
9730: 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74  void fts5PrintSt
9740: 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68  ructure(const ch
9750: 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74  ar *zCaption, Ft
9760: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9770: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ruct){.  int rc 
9780: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
9790: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
97a0: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
97b0: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20   sizeof(buf));. 
97c0: 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
97d0: 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70  ure(&rc, &buf, p
97e0: 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e  Struct);.  fprin
97f0: 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20  tf(stdout, "%s: 
9800: 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c  %s\n", zCaption,
9810: 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73   buf.p);.  fflus
9820: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73  h(stdout);.  fts
9830: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
9840: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9850: 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72  ine fts5PrintStr
9860: 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64  ucture(x,y).#end
9870: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  if..static int f
9880: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46  ts5SegmentSize(F
9890: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
98a0: 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65  ent *pSeg){.  re
98b0: 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70  turn 1 + pSeg->p
98c0: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
98d0: 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a  pgnoFirst;.}../*
98e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70  .** Return a cop
98f0: 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  y of index struc
9900: 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78  ture pStruct. Ex
9910: 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73  cept, promote as
9920: 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e   many .** segmen
9930: 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74  ts as possible t
9940: 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65  o level iPromote
9950: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  . If an OOM occu
9960: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20  rs, NULL is .** 
9970: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
9980: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
9990: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
99a0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
99b0: 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c  .  int iPromote,
99c0: 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65  .  int szPromote
99d0: 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
99e0: 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20  e *pStruct.){.  
99f0: 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74  int il, is;.  Ft
9a00: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9a10: 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63   *pOut = &pStruc
9a20: 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f  t->aLevel[iPromo
9a30: 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74  te];..  if( pOut
9a40: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ->nMerge==0 ){. 
9a50: 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f     for(il=iPromo
9a60: 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74  te+1; il<pStruct
9a70: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b  ->nLevel; il++){
9a80: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
9a90: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
9aa0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9ab0: 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66  el[il];.      if
9ac0: 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
9ad0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66   return;.      f
9ae0: 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67  or(is=pLvl->nSeg
9af0: 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29  -1; is>=0; is--)
9b00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
9b10: 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69   = fts5SegmentSi
9b20: 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  ze(&pLvl->aSeg[i
9b30: 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s]);.        if(
9b40: 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20   sz>szPromote ) 
9b50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9b60: 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
9b70: 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
9b80: 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f   pStruct, iPromo
9b90: 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
9ba0: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
9bb0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d  eturn;.        m
9bc0: 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67  emcpy(pOut->aSeg
9bd0: 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  , &pLvl->aSeg[is
9be0: 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  ], sizeof(Fts5St
9bf0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29  ructureSegment))
9c00: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
9c10: 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nSeg++;.        
9c20: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  pLvl->nSeg--;.  
9c30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73  }../*.** A new s
9c50: 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20  egment has just 
9c60: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
9c70: 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e  level iLvl of in
9c80: 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  dex structure.**
9c90: 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66   pStruct. This f
9ca0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
9cb0: 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e  es if any segmen
9cc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  ts should be pro
9cd0: 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65  moted.** as a re
9ce0: 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61  sult. Segments a
9cf0: 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74  re promoted in t
9d00: 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
9d10: 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20  .**   a) If the 
9d20: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9d30: 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20  tten is smaller 
9d40: 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  than one or more
9d50: 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20   segments.**    
9d60: 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65    within the pre
9d70: 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20  vious populated 
9d80: 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f  level, it is pro
9d90: 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65  moted to the pre
9da0: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f  vious.**      po
9db0: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a  pulated level..*
9dc0: 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65  *.**   b) If the
9dd0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9de0: 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20  itten is larger 
9df0: 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20  than the newest 
9e00: 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20  segment on.**   
9e10: 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75     the next popu
9e20: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65  lated level, the
9e30: 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20  n that segment, 
9e40: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64  and any other ad
9e50: 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73  jacent.**      s
9e60: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  egments that are
9e70: 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68   also smaller th
9e80: 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20  an the one just 
9e90: 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a  written, are .**
9ea0: 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20        promoted. 
9eb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72  .**.** If one or
9ec0: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61   more segments a
9ed0: 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65  re promoted, the
9ee0: 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
9ef0: 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20  t is updated.** 
9f00: 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  to reflect this.
9f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9f20: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9f30: 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  mote(.  Fts5Inde
9f40: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
9f50: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
9f60: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
9f70: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76      /* Index lev
9fa0: 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  el just updated 
9fb0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
9fc0: 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20  re *pStruct     
9fd0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
9fe0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9ff0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a000: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
a010: 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50  iTst;.    int iP
a020: 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20  romote = -1;.   
a030: 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d   int szPromote =
a040: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
a050: 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69  * Promote anythi
a060: 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20  ng this size or 
a070: 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46  smaller */.    F
a080: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
a090: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
a0a0: 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  Segment just wri
a0b0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
a0c0: 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  szSeg;          
a0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a0e0: 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73  e of segment jus
a0f0: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
a100: 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
a110: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
a120: 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28  ].nSeg;..    if(
a130: 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nSeg==0 ) retur
a140: 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  n;.    pSeg = &p
a150: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a160: 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63  Lvl].aSeg[pStruc
a170: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a180: 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53  nSeg-1];.    szS
a190: 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e  eg = (1 + pSeg->
a1a0: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
a1b0: 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20  >pgnoFirst);..  
a1c0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
a1d0: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a  ondition (a) */.
a1e0: 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76      for(iTst=iLv
a1f0: 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20  l-1; iTst>=0 && 
a200: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a210: 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iTst].nSeg==0; i
a220: 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20  Tst--);.    if( 
a230: 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iTst>=0 ){.     
a240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
a250: 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  t szMax = 0;.   
a260: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
a270: 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70  Level *pTst = &p
a280: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a290: 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Tst];.      asse
a2a0: 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65  rt( pTst->nMerge
a2b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
a2c0: 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53  (i=0; i<pTst->nS
a2d0: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
a2e0: 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d    int sz = pTst-
a2f0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73  >aSeg[i].pgnoLas
a300: 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  t - pTst->aSeg[i
a310: 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b  ].pgnoFirst + 1;
a320: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
a330: 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20  szMax ) szMax = 
a340: 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
a350: 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53    if( szMax>=szS
a360: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  eg ){.        /*
a370: 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   Condition (a) i
a380: 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20  s true. Promote 
a390: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
a3a0: 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20  nt on level .   
a3b0: 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20       ** iLvl to 
a3c0: 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a  level iTst.  */.
a3d0: 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65          iPromote
a3e0: 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20   = iTst;.       
a3f0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d   szPromote = szM
a400: 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ax;.      }.    
a410: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e  }..    /* If con
a420: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f  dition (a) is no
a430: 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62  t met, assume (b
a440: 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63  ) is true. Struc
a450: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a  turePromoteTo().
a460: 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f      ** is a no-o
a470: 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  p if it is not. 
a480: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
a490: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
a4a0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
a4b0: 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65  .      szPromote
a4c0: 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a   = szSeg;.    }.
a4d0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
a4e0: 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50  ePromoteTo(p, iP
a4f0: 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74  romote, szPromot
a500: 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  e, pStruct);.  }
a510: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
a520: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a530: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a540: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ly argument. If 
a550: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
a560: 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
a570: 20 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64   page is reached
a580: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
a590: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
a5a0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a5b0: 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a  t(Fts5DlidxLvl *
a5c0: 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74  pLvl){.  Fts5Dat
a5d0: 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d  a *pData = pLvl-
a5e0: 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  >pData;..  if( p
a5f0: 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a  Lvl->iOff==0 ){.
a600: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
a610: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20  ->bEof==0 );.   
a620: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b   pLvl->iOff = 1;
a630: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a640: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a650: 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c  32(&pData->p[1],
a660: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a670: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
a680: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a690: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76  nt(&pData->p[pLv
a6a0: 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  l->iOff], (u64*)
a6b0: 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a  &pLvl->iRowid);.
a6c0: 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74      pLvl->iFirst
a6d0: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a6e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a6f0: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72  nt iOff;.    for
a700: 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66  (iOff=pLvl->iOff
a710: 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ; iOff<pData->nn
a720: 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20  ; iOff++){.     
a730: 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f   if( pData->p[iO
a740: 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20  ff] ) break; .  
a750: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66    }..    if( iOf
a760: 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  f<pData->nn ){. 
a770: 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20       i64 iVal;. 
a780: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66       pLvl->iLeaf
a790: 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20  Pgno += (iOff - 
a7a0: 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b  pLvl->iOff) + 1;
a7b0: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
a7c0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
a7d0: 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ata->p[iOff], (u
a7e0: 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
a7f0: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b    pLvl->iRowid +
a800: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c  = iVal;.      pL
a810: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  vl->iOff = iOff;
a820: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a830: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
a840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
a850: 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66  eturn pLvl->bEof
a860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
a870: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a880: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a890: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
a8a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a8b0: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74  lidxIterNextR(Ft
a8c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a8d0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a8e0: 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46  , int iLvl){.  F
a8f0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a900: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
a910: 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  [iLvl];..  asser
a920: 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e  t( iLvl<pIter->n
a930: 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73  Lvl );.  if( fts
a940: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
a950: 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  vl) ){.    if( (
a960: 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d  iLvl+1) < pIter-
a970: 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66  >nLvl ){.      f
a980: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
a990: 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c  R(p, pIter, iLvl
a9a0: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
a9b0: 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29  Lvl[1].bEof==0 )
a9c0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
a9d0: 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
a9e0: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
a9f0: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
aa00: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
aa10: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Lvl));.        p
aa20: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
aa30: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
aa40: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
aa50: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
aa60: 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20  ->iSegid, iLvl, 
aa70: 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e  pLvl[1].iLeafPgn
aa80: 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
aa90: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
aaa0: 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64  pData ) fts5Dlid
aab0: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a  xLvlNext(pLvl);.
aac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aad0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
aae0: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
aaf0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
ab00: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
ab10: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ab20: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
ab30: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  er){.  return ft
ab40: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
ab50: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d  (p, pIter, 0);.}
ab60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
ab70: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
ab80: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ab90: 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  t has the follow
aba0: 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a  ing fields set.*
abb0: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68  * as follows. Th
abc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
abd0: 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20   up the rest of 
abe0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
abf0: 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74  that it.** point
ac00: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
ac10: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
ac20: 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ist-index..**.**
ac30: 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20     pData:.**    
ac40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
ac50: 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64  ist-index record
ac60: 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  , .**.** When th
ac70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ac80: 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65  alled pIter->iLe
ac90: 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61  afPgno is the pa
aca0: 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a  ge number the.**
acb0: 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f   doclist is asso
acc0: 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65  ciated with (the
acd0: 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74   one featuring t
ace0: 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61  he term)..*/.sta
acf0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
ad00: 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44  xIterFirst(Fts5D
ad10: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
ad20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
ad30: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
ad40: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  Lvl; i++){.    f
ad50: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
ad60: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29  &pIter->aLvl[i])
ad70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ad80: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ad90: 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  of;.}...static i
ada0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
adb0: 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
adc0: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
add0: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
ade0: 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  n p->rc!=SQLITE_
adf0: 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76  OK || pIter->aLv
ae00: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  l[0].bEof;.}..st
ae10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
ae20: 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35  idxIterLast(Fts5
ae30: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
ae40: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
ae50: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
ae60: 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76  Advance each lev
ae70: 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  el to the last e
ae80: 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74  ntry on the last
ae90: 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69   page */.  for(i
aea0: 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20  =pIter->nLvl-1; 
aeb0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
aec0: 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a   && i>=0; i--){.
aed0: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
aee0: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
aef0: 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68  >aLvl[i];.    wh
af00: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
af10: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
af20: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  ;.    pLvl->bEof
af30: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
af40: 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >0 ){.      Fts5
af50: 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64  DlidxLvl *pChild
af60: 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20   = &pLvl[-1];.  
af70: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
af80: 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74  ase(pChild->pDat
af90: 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  a);.      memset
afa0: 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65  (pChild, 0, size
afb0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
afc0: 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
afd0: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
afe0: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
aff0: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
b000: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
b010: 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69  id, i-1, pLvl->i
b020: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b030: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b040: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
b050: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
b060: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
b070: 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69  ent to the previ
b080: 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  ous entry..*/.st
b090: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b0a0: 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c  dxLvlPrev(Fts5Dl
b0b0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20  idxLvl *pLvl){. 
b0c0: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c   int iOff = pLvl
b0d0: 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  ->iOff;..  asser
b0e0: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
b0f0: 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d   );.  if( iOff<=
b100: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b110: 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  ){.    pLvl->bEo
b120: 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
b130: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c      u8 *a = pLvl
b140: 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20  ->pData->p;.    
b150: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e  i64 iVal;.    in
b160: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e  t iLimit;.    in
b170: 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a  t ii;.    int nZ
b180: 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ero = 0;..    /*
b190: 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20   Currently iOff 
b1a0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b1b0: 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61  rst byte of a va
b1c0: 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  rint. This block
b1d0: 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65   .    ** decreme
b1e0: 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69  nts iOff until i
b1f0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
b200: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
b210: 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20  e previous .    
b220: 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e  ** varint. Takin
b230: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
b240: 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f  ad any memory lo
b250: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  cations that occ
b260: 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ur.    ** before
b270: 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d   the buffer in m
b280: 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  emory.  */.    i
b290: 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20  Limit = (iOff>9 
b2a0: 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20  ? iOff-9 : 0);. 
b2b0: 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69     for(iOff--; i
b2c0: 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66  Off>iLimit; iOff
b2d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
b2e0: 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30  a[iOff-1] & 0x80
b2f0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
b300: 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74    }..    fts5Get
b310: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
b320: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
b330: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
b340: 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76  -= iVal;.    pLv
b350: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a  l->iLeafPgno--;.
b360: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63  .    /* Skip bac
b370: 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20  kwards past any 
b380: 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f  0x00 varints. */
b390: 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66  .    for(ii=iOff
b3a0: 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46  -1; ii>=pLvl->iF
b3b0: 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d  irstOff && a[ii]
b3c0: 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20  ==0x00; ii--){. 
b3d0: 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20       nZero++;.  
b3e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d    }.    if( ii>=
b3f0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b400: 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30  && (a[ii] & 0x80
b410: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
b420: 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
b430: 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ly before the la
b440: 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73  st 0x00 byte has
b450: 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20   the 0x80 bit.  
b460: 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74      ** set. So t
b470: 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20  he last 0x00 is 
b480: 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20  only a varint 0 
b490: 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d  if there are 8 m
b4a0: 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a  ore 0x80.      *
b4b0: 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61  * bytes before a
b4c0: 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69  [ii]. */.      i
b4d0: 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20  nt bZero = 0;   
b4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
b4f0: 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20  ue if last 0x00 
b500: 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  counts */.      
b510: 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c  if( (ii-8)>=pLvl
b520: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b530: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
b540: 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
b550: 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20  <=8 && (a[ii-j] 
b560: 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20  & 0x80); j++);. 
b570: 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28         bZero = (
b580: 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j>8);.      }.  
b590: 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30      if( bZero==0
b5a0: 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20   ) nZero--;.    
b5b0: 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61  }.    pLvl->iLea
b5c0: 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a  fPgno -= nZero;.
b5d0: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
b5e0: 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20   iOff - nZero;. 
b5f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
b600: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  l->bEof;.}..stat
b610: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b620: 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e  IterPrevR(Fts5In
b630: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
b640: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
b650: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
b660: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b670: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
b680: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
b690: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
b6a0: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
b6b0: 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20  dxLvlPrev(pLvl) 
b6c0: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
b6d0: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
b6e0: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
b6f0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
b700: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
b710: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
b720: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
b730: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
b740: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
b750: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
b760: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
b770: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b780: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
b790: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b7a0: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b7b0: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
b7c0: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
b7d0: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
b7e0: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
b7f0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
b800: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
b810: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  a ){.          w
b820: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
b830: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
b840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  );.          pLv
b850: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  l->bEof = 0;.   
b860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b870: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b880: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
b890: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
b8a0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b8b0: 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78  erPrev(Fts5Index
b8c0: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
b8d0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
b8e0: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
b8f0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
b900: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , 0);.}../*.** F
b910: 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ree a doclist-in
b920: 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  dex iterator obj
b930: 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ect allocated by
b940: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
b950: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
b960: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
b970: 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78  erFree(Fts5Dlidx
b980: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b990: 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
b9a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
b9b0: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
b9c0: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  vl; i++){.      
b9d0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
b9e0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70  pIter->aLvl[i].p
b9f0: 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
ba00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
ba10: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
ba20: 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65  tic Fts5DlidxIte
ba30: 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72  r *fts5DlidxIter
ba40: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
ba50: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
ba60: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
ba70: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
ba80: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
ba90: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bab0: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
bac0: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
bad0: 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
baf0: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
bb00: 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20  int iLeafPg     
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d  /* Leaf page num
bb30: 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64  ber to load dlid
bb40: 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  x for */.){.  Ft
bb50: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bb60: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  er = 0;.  int i;
bb70: 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
bb80: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
bb90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
bba0: 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
bbb0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
bbc0: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  = sizeof(Fts5Dli
bbd0: 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69  dxIter) + i * si
bbe0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
bbf0: 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  l);.    Fts5Dlid
bc00: 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  xIter *pNew;..  
bc10: 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c    pNew = (Fts5Dl
bc20: 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33  idxIter*)sqlite3
bc30: 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20  _realloc(pIter, 
bc40: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
bc50: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
bc60: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
bc70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
bc80: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
bc90: 69 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f  id = FTS5_DLIDX_
bca0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c  ROWID(iSegid, i,
bcb0: 20 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20   iLeafPg);.     
bcc0: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
bcd0: 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76  Lvl = &pNew->aLv
bce0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65  l[i];.      pIte
bcf0: 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
bd00: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
bd10: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
bd20: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76  Lvl));.      pLv
bd30: 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  l->pData = fts5D
bd40: 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69  ataRead(p, iRowi
bd50: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  d);.      if( pL
bd60: 76 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c  vl->pData && (pL
bd70: 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20  vl->pData->p[0] 
bd80: 26 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a  & 0x0001)==0 ){.
bd90: 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20          bDone = 
bda0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
bdb0: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69   pIter->nLvl = i
bdc0: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  +1;.    }.  }.. 
bdd0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
bde0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74  TE_OK ){.    pIt
bdf0: 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  er->iSegid = iSe
be00: 67 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65  gid;.    if( bRe
be10: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  v==0 ){.      ft
be20: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
be30: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c  (pIter);.    }el
be40: 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  se{.      fts5Dl
be50: 69 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70  idxIterLast(p, p
be60: 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
be70: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ..  if( p->rc!=S
be80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
be90: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
bea0: 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49  e(pIter);.    pI
beb0: 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ter = 0;.  }..  
bec0: 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a  return pIter;.}.
bed0: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
bee0: 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 46  DlidxIterRowid(F
bef0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
bf00: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ter){.  return p
bf10: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52  Iter->aLvl[0].iR
bf20: 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69  owid;.}.static i
bf30: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
bf40: 50 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74  Pgno(Fts5DlidxIt
bf50: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
bf60: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
bf70: 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d  [0].iLeafPgno;.}
bf80: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
bf90: 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20   next leaf page 
bfa0: 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  into the segment
bfb0: 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   iterator..*/.st
bfc0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
bfd0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20  gIterNextPage(. 
bfe0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
c010: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
c020: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c040: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
c050: 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65  nce to next page
c060: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74   */.){.  Fts5Dat
c070: 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74 73 35  a *pLeaf;.  Fts5
c080: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
c090: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
c0a0: 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61  pSeg;.  fts5Data
c0b0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
c0c0: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
c0d0: 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69  iLeafPgno++;.  i
c0e0: 66 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  f( pIter->pNextL
c0f0: 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  eaf ){.    pIter
c100: 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d  ->pLeaf = pIter-
c110: 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20 20  >pNextLeaf;.    
c120: 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
c130: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
c140: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
c150: 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  no<=pSeg->pgnoLa
c160: 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  st ){.    pIter-
c170: 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 4c 65 61  >pLeaf = fts5Lea
c180: 66 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  fRead(p, .      
c190: 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
c1a0: 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
c1b0: 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  d, pIter->iLeafP
c1c0: 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65  gno).    );.  }e
c1d0: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
c1e0: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 20  pLeaf = 0;.  }. 
c1f0: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
c200: 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20 70 4c  pLeaf;..  if( pL
c210: 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  eaf ){.    pIter
c220: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c  ->iPgidxOff = pL
c230: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20  eaf->szLeaf;.   
c240: 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54   if( fts5LeafIsT
c250: 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29  ermless(pLeaf) )
c260: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
c270: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
c280: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20  Leaf->nn+1;.    
c290: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
c2a0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d  er->iPgidxOff +=
c2b0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
c2c0: 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72  (&pLeaf->p[pIter
c2d0: 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a 20 20  ->iPgidxOff],.  
c2e0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
c2f0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20  EndofDoclist.   
c300: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
c310: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
c320: 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
c330: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
c340: 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65  g a varint to be
c350: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
c360: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69  a.** position li
c370: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
c380: 65 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61  ead the varint a
c390: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  nd return the nu
c3a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a  mber of bytes.**
c3b0: 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65   read. Before re
c3c0: 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e  turning, set *pn
c3d0: 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  Sz to the number
c3e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
c3f0: 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73   position.** lis
c400: 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f  t, and *pbDel to
c410: 20 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c   true if the del
c420: 65 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ete flag is set,
c430: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
c440: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
c450: 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  nt fts5GetPoslis
c460: 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a  tSize(const u8 *
c470: 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e  p, int *pnSz, in
c480: 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74  t *pbDel){.  int
c490: 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   nSz;.  int n = 
c4a0: 30 3b 0a 20 20 66 74 73 35 46 61 73 74 47 65 74  0;.  fts5FastGet
c4b0: 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 2c 20 6e  Varint32(p, n, n
c4c0: 53 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  Sz);.  assert_nc
c4d0: 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70  ( nSz>=0 );.  *p
c4e0: 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a  nSz = nSz/2;.  *
c4f0: 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78  pbDel = nSz & 0x
c500: 30 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e  0001;.  return n
c510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53  ;.}../*.** Fts5S
c520: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c530: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
c540: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
c550: 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f   byte of a.** po
c560: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
c570: 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65   field. Read the
c580: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69   value of the fi
c590: 65 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74  eld and store it
c5a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  .** in the follo
c5b0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a  wing variables:.
c5c0: 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  **.**   Fts5SegI
c5d0: 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74  ter.nPos.**   Ft
c5e0: 73 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a  s5SegIter.bDel.*
c5f0: 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35 53  *.** Leave Fts5S
c600: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c610: 65 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  et pointing to t
c620: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c630: 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f   the .** positio
c640: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 28  n list content (
c650: 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74  if any)..*/.stat
c660: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
c670: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35  terLoadNPos(Fts5
c680: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c690: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
c6a0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c6b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
c6c0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
c6d0: 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20  LeafOffset;  /* 
c6e0: 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61  Offset to read a
c6f0: 74 20 2a 2f 0a 20 20 20 20 41 53 53 45 52 54 5f  t */.    ASSERT_
c700: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
c710: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28  >pLeaf);.    if(
c720: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
c730: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
c740: 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
c750: 69 6e 74 20 69 45 6f 64 20 3d 20 4d 49 4e 28 70  int iEod = MIN(p
c760: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c770: 69 73 74 2c 20 70 49 74 65 72 2d 3e 70 4c 65 61  ist, pIter->pLea
c780: 66 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20 20 20 20  f->szLeaf);.    
c790: 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
c7a0: 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  0;.      pIter->
c7b0: 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  nPos = 1;.      
c7c0: 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26  if( iOff<iEod &&
c7d0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
c7e0: 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOff]==0 ){.   
c7f0: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c       pIter->bDel
c800: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 4f   = 1;.        iO
c810: 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ff++;.        if
c820: 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70  ( iOff<iEod && p
c830: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
c840: 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Off]==0 ){.     
c850: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
c860: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
c870: 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
c880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c890: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 30   pIter->nPos = 0
c8a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c8b0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
c8c0: 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20       int nSz;.  
c8d0: 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
c8e0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70  arint32(pIter->p
c8f0: 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e  Leaf->p, iOff, n
c900: 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  Sz);.      pIter
c910: 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20  ->bDel = (nSz & 
c920: 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70  0x0001);.      p
c930: 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a  Iter->nPos = nSz
c940: 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >>1;.      asser
c950: 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f  t_nc( pIter->nPo
c960: 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  s>=0 );.    }.  
c970: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c980: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d  fset = iOff;.  }
c990: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
c9a0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52  fts5SegIterLoadR
c9b0: 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  owid(Fts5Index *
c9c0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
c9d0: 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20  pIter){.  u8 *a 
c9e0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c9f0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66  p;        /* Buf
ca00: 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61  fer to read data
ca10: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
ca20: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
ca30: 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53  afOffset;..  ASS
ca40: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
ca50: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69  ter->pLeaf);.  i
ca60: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
ca70: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
ca80: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
ca90: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
caa0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  r);.    if( pIte
cab0: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  r->pLeaf==0 ){. 
cac0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
cad0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
cae0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
caf0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
cb00: 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d      }.    iOff =
cb10: 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65   4;.    a = pIte
cb20: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d  r->pLeaf->p;.  }
cb30: 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74  .  iOff += sqlit
cb40: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
cb50: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
cb60: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
cb70: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
cb80: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a  ffset = iOff;.}.
cb90: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
cba0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
cbb0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
cbc0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
cbd0: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53  e of the .** "nS
cbe0: 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20  uffix" field of 
cbf0: 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e  a term. Function
cc00: 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70   parameter nKeep
cc10: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
cc20: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e  lue.** of the "n
cc30: 50 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69  Prefix" field (i
cc40: 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20  f there was one 
cc50: 2d 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30  - it is passed 0
cc60: 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74   if this is.** t
cc70: 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e  he first term in
cc80: 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a   the segment)..*
cc90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
cca0: 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a  on populates:.**
ccb0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
ccc0: 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35  r.term.**   Fts5
ccd0: 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a  SegIter.rowid.**
cce0: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  .** accordingly 
ccf0: 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35  and leaves (Fts5
cd00: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
cd10: 73 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20  set) set to the 
cd20: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68  content of.** th
cd30: 65 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e  e first position
cd40: 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74   list. The posit
cd50: 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69  ion list belongi
cd60: 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a  ng to document .
cd70: 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  ** (Fts5SegIter.
cd80: 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74  iRowid)..*/.stat
cd90: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
cda0: 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35  terLoadTerm(Fts5
cdb0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
cdc0: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  gIter *pIter, in
cdd0: 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a  t nKeep){.  u8 *
cde0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
cdf0: 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ->p;        /* B
ce00: 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61  uffer to read da
ce10: 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ta from */.  int
ce20: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
ce30: 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20  LeafOffset;  /* 
ce40: 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61  Offset to read a
ce50: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  t */.  int nNew;
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
ce80: 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a  of new data */..
ce90: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
cea0: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
ceb0: 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28  f], nNew);.  if(
cec0: 20 69 4f 66 66 2b 6e 4e 65 77 3e 70 49 74 65 72   iOff+nNew>pIter
ced0: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20  ->pLeaf->nn ){. 
cee0: 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
cef0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74  CORRUPT;.    ret
cf00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  urn;.  }.  pIter
cf10: 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70  ->term.n = nKeep
cf20: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
cf30: 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
cf40: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
cf50: 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
cf60: 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a    iOff += nNew;.
cf70: 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
cf80: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
cf90: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
cfa0: 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
cfb0: 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49  >iLeafPgno;.  pI
cfc0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
cfd0: 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20   = iOff;..  if( 
cfe0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
cff0: 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
d000: 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  nn ){.    pIter-
d010: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
d020: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
d030: 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n+1;.  }else{.  
d040: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20    int nExtra;.  
d050: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
d060: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
d070: 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d 3e  int32(&a[pIter->
d080: 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78 74  iPgidxOff], nExt
d090: 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ra);.    pIter->
d0a0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b 3d  iEndofDoclist +=
d0b0: 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20 20   nExtra;.  }..  
d0c0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52  fts5SegIterLoadR
d0d0: 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a  owid(p, pIter);.
d0e0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
d0f0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 46  ts5SegIterNext(F
d100: 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53  ts5Index*, Fts5S
d110: 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a  egIter*, int*);.
d120: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d130: 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65  SegIterNext_Reve
d140: 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  rse(Fts5Index*, 
d150: 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e  Fts5SegIter*, in
d160: 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
d170: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d180: 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78 2a  _None(Fts5Index*
d190: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20  , Fts5SegIter*, 
d1a0: 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20 76  int*);..static v
d1b0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53  oid fts5SegIterS
d1c0: 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  etNext(Fts5Index
d1d0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
d1e0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
d1f0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
d200: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
d210: 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72  RSE ){.    pIter
d220: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65  ->xNext = fts5Se
d230: 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73  gIterNext_Revers
d240: 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  e;.  }else if( p
d250: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
d260: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
d270: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74 65  NONE ){.    pIte
d280: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d290: 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b  egIterNext_None;
d2a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
d2b0: 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73  ter->xNext = fts
d2c0: 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20 20  5SegIterNext;.  
d2d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  }.}../*.** Initi
d2e0: 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74  alize the iterat
d2f0: 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  or object pIter 
d300: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
d310: 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  gh the entries i
d320: 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65  n.** segment pSe
d330: 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  g. The iterator 
d340: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
d350: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
d360: 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69  try when .** thi
d370: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
d380: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ns..**.** If an 
d390: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
d3a0: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
d3b0: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
d3c0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
d3d0: 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
d3e0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
d3f0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
d400: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d410: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d430: 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
d440: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
d450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d460: 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78      /* FTS index
d470: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
d480: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
d490: 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
d4a0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73  Description of s
d4b0: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
d4c0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d4e0: 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
d4f0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53  e */.){.  if( pS
d500: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30  eg->pgnoFirst==0
d510: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
d520: 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73  happens if the s
d530: 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20  egment is being 
d540: 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74  used as an input
d550: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
d560: 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20  al.    ** merge 
d570: 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73  and all data has
d580: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74   already been "t
d590: 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e  rimmed". See fun
d5a0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73  ction.    ** fts
d5b0: 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20  5TrimSegments() 
d5c0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20  for details. In 
d5d0: 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20  this case leave 
d5e0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70  the iterator emp
d5f0: 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  ty..    ** The c
d600: 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74  aller will see t
d610: 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  he (pIter->pLeaf
d620: 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20  ==0) and assume 
d630: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a  the iterator is.
d640: 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c      ** at EOF al
d650: 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73  ready. */.    as
d660: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65  sert( pIter->pLe
d670: 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  af==0 );.    ret
d680: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
d690: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d6a0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
d6b0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
d6c0: 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74  *pIter));.    ft
d6d0: 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74  s5SegIterSetNext
d6e0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
d6f0: 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
d700: 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  eg;.    pIter->i
d710: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d  LeafPgno = pSeg-
d720: 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20  >pgnoFirst-1;.  
d730: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
d740: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
d750: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
d760: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d770: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d780: 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20  Offset = 4;.    
d790: 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72  assert_nc( pIter
d7a0: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b  ->pLeaf->nn>4 );
d7b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
d7c0: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
d7d0: 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d  f(pIter->pLeaf)=
d7e0: 3d 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  =4 );.    pIter-
d7f0: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74  >iPgidxOff = pIt
d800: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
d810: 66 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  f+1;.    fts5Seg
d820: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
d830: 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66  pIter, 0);.    f
d840: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
d850: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
d860: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
d870: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
d880: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20   ever called on 
d890: 69 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65  iterators create
d8a0: 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  d by calls to.**
d8b0: 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28   Fts5IndexQuery(
d8c0: 29 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49  ) with the FTS5I
d8d0: 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
d8e0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
d8f0: 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  The iterator is 
d900: 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74  in an unusual st
d910: 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
d920: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d930: 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67  : the.** Fts5Seg
d940: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
d950: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
d960: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f   to the offset o
d970: 66 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  f the start of.*
d980: 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  * the position-l
d990: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66  ist size field f
d9a0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c  or the first rel
d9b0: 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
d9c0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35  he page..** Fts5
d9d0: 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73  SegIter.rowid is
d9e0: 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61   set, but nPos a
d9f0: 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e  nd bDel are not.
da00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
da10: 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68  tion advances th
da20: 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
da30: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
da40: 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c  the last .** rel
da50: 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
da60: 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20  he page and, if 
da70: 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69  necessary, initi
da80: 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61  alizes the .** a
da90: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e  RowidOffset[] an
daa0: 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76  d iRowidOffset v
dab0: 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69  ariables. At thi
dac0: 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72  s point the iter
dad0: 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74  ator.** is in it
dae0: 73 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20  s regular state 
daf0: 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  - Fts5SegIter.iL
db00: 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73  eafOffset points
db10: 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
db20: 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73   byte of the pos
db30: 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65  ition list conte
db40: 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
db50: 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a  th said rowid..*
db60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
db70: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
db80: 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64  InitPage(Fts5Ind
db90: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
dba0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
dbb0: 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
dbc0: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
dbd0: 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72  .  int n = pIter
dbe0: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
dbf0: 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72  .  int i = pIter
dc00: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
dc10: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
dc20: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20  pLeaf->p;.  int 
dc30: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30  iRowidOffset = 0
dc40: 3b 0a 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72  ;..  if( n>pIter
dc50: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
dc60: 29 7b 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72  ){.    n = pIter
dc70: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b  ->iEndofDoclist;
dc80: 0a 20 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53  .  }..  ASSERT_S
dc90: 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e  ZLEAF_OK(pIter->
dca0: 70 4c 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28  pLeaf);.  while(
dcb0: 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44   1 ){.    i64 iD
dcc0: 65 6c 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 69  elta = 0;..    i
dcd0: 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
dce0: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
dcf0: 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f        /* todo */
dd00: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26  .      if( i<n &
dd10: 26 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  & a[i]==0 ){.   
dd20: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
dd30: 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69    if( i<n && a[i
dd40: 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20  ]==0 ) i++;.    
dd50: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
dd60: 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20       int nPos;. 
dd70: 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
dd80: 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
dd90: 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
dda0: 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  a[i], &nPos, &bD
ddb0: 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 20 2b  ummy);.      i +
ddc0: 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20  = nPos;.    }.  
ddd0: 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65    if( i>=n ) bre
dde0: 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ak;.    i += fts
ddf0: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d  5GetVarint(&a[i]
de00: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
de10: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
de20: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a  wid += iDelta;..
de30: 20 20 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73      /* If necess
de40: 61 72 79 2c 20 67 72 6f 77 20 74 68 65 20 70 49  ary, grow the pI
de50: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
de60: 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  t[] array. */.  
de70: 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73    if( iRowidOffs
de80: 65 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69  et>=pIter->nRowi
de90: 64 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  dOffset ){.     
dea0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65   int nNew = pIte
deb0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
dec0: 2b 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  + 8;.      int *
ded0: 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c  aNew = (int*)sql
dee0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74  ite3_realloc(pIt
def0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
df00: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e  , nNew*sizeof(in
df10: 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  t));.      if( a
df20: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
df30: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
df40: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
df50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
df60: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77       pIter->aRow
df70: 69 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b  idOffset = aNew;
df80: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52  .      pIter->nR
df90: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65  owidOffset = nNe
dfa0: 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49  w;.    }..    pI
dfb0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
dfc0: 74 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b  t[iRowidOffset++
dfd0: 5d 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ] = pIter->iLeaf
dfe0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65  Offset;.    pIte
dff0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e000: 20 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d   i;.  }.  pIter-
e010: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >iRowidOffset = 
e020: 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20  iRowidOffset;.  
e030: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e040: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  Pos(p, pIter);.}
e050: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
e060: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
e070: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
e080: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
e090: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
e0a0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
e0b0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
e0c0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
e0d0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
e0e0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
e0f0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
e100: 52 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74  RM );..  fts5Dat
e110: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
e120: 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
e130: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68  >pLeaf = 0;.  wh
e140: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
e150: 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
e160: 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
e170: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
e180: 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
e190: 70 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d  pNew;.    pIter-
e1a0: 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20  >iLeafPgno--;.  
e1b0: 20 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74    pNew = fts5Dat
e1c0: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
e1d0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20  GMENT_ROWID(.   
e1e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53         pIter->pS
e1f0: 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65  eg->iSegid, pIte
e200: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20  r->iLeafPgno.   
e210: 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   ));.    if( pNe
e220: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54  w ){.      /* iT
e230: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61  ermLeafOffset ma
e240: 79 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a  y be equal to sz
e250: 4c 65 61 66 20 69 66 20 74 68 65 20 74 65 72 6d  Leaf if the term
e260: 20 69 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20   is the last.   
e270: 20 20 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74     ** thing on t
e280: 68 65 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74  he page - i.e. t
e290: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
e2a0: 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s on the followi
e2b0: 6e 67 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a  ng page..      *
e2c0: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  * In this case l
e2d0: 65 61 76 65 20 70 49 74 65 72 2d 3e 70 4c 65 61  eave pIter->pLea
e2e0: 66 3d 3d 30 2c 20 74 68 69 73 20 69 74 65 72 61  f==0, this itera
e2f0: 74 6f 72 20 69 73 20 61 74 20 45 4f 46 2e 20 2a  tor is at EOF. *
e300: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  /.      if( pIte
e310: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  r->iLeafPgno==pI
e320: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
e330: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  no ){.        as
e340: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65  sert( pIter->pLe
e350: 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  af==0 );.       
e360: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72   if( pIter->iTer
e370: 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77  mLeafOffset<pNew
e380: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e390: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
e3a0: 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  af = pNew;.     
e3b0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e3c0: 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
e3d0: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
e3e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e400: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a   int iRowidOff;.
e410: 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66          iRowidOf
e420: 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
e430: 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b  tRowidOff(pNew);
e440: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f  .        if( iRo
e450: 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  widOff ){.      
e460: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
e470: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
e480: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e490: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
e4a0: 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  f;.        }.   
e4b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
e4c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
e4d0: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
e4e0: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
e4f0: 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66  [pIter->iLeafOff
e500: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  set];.        pI
e510: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e520: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
e530: 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65  t(a, (u64*)&pIte
e540: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
e550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e570: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
e580: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
e590: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e5a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
e5b0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
e5c0: 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72  fDoclist = pIter
e5d0: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20  ->pLeaf->nn+1;. 
e5e0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
e5f0: 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
e600: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
e610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
e620: 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  e if the iterato
e630: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
e640: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
e650: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
e660: 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20  nts to a delete 
e670: 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65  marker. A delete
e680: 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e   marker is an en
e690: 74 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74  try with a 0 byt
e6a0: 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  e.** position-li
e6b0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
e6c0: 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  t fts5MultiIterI
e6d0: 73 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78  sEmpty(Fts5Index
e6e0: 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70   *p, Fts5Iter *p
e6f0: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
e700: 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
e710: 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
e720: 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
e730: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  t];.  return (p-
e740: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
e750: 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26  & pSeg->pLeaf &&
e760: 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b   pSeg->nPos==0);
e770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
e780: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
e790: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
e7a0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ry..**.** This v
e7b0: 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65  ersion of fts5Se
e7c0: 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f  gIterNext() is o
e7d0: 6e 6c 79 20 75 73 65 64 20 62 79 20 72 65 76 65  nly used by reve
e7e0: 72 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  rse iterators..*
e7f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e800: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65  s5SegIterNext_Re
e810: 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64  verse(.  Fts5Ind
e820: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
e830: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
e840: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
e850: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
e860: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
e870: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
e880: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
e890: 20 69 6e 74 20 2a 70 62 55 6e 75 73 65 64 20 20   int *pbUnused  
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b   /* Unused */.){
e8c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
e8d0: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
e8e0: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
e8f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
e900: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
e910: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
e920: 4d 28 70 62 55 6e 75 73 65 64 29 3b 0a 0a 20 20  M(pbUnused);..  
e930: 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  if( pIter->iRowi
e940: 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  dOffset>0 ){.   
e950: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
e960: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e  pLeaf->p;.    in
e970: 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 36 34 20  t iOff;.    i64 
e980: 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 49 74  iDelta;..    pIt
e990: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
e9a0: 2d 2d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  --;.    pIter->i
e9b0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
e9c0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
e9d0: 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66  [pIter->iRowidOf
e9e0: 66 73 65 74 5d 3b 0a 20 20 20 20 66 74 73 35 53  fset];.    fts5S
e9f0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
ea00: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 4f  , pIter);.    iO
ea10: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
ea20: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 66 28  fOffset;.    if(
ea30: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
ea40: 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
ea50: 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
ea60: 69 4f 66 66 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  iOff += pIter->n
ea70: 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Pos;.    }.    f
ea80: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
ea90: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
eaa0: 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72  elta);.    pIter
eab0: 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c  ->iRowid -= iDel
eac0: 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ta;.  }else{.   
ead0: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
eae0: 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49  rseNewPage(p, pI
eaf0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
eb00: 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  ** Advance itera
eb10: 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65  tor pIter to the
eb20: 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   next entry..**.
eb30: 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
eb40: 6f 66 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  of fts5SegIterNe
eb50: 78 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  xt() is only use
eb60: 64 20 69 66 20 64 65 74 61 69 6c 3d 6e 6f 6e 65  d if detail=none
eb70: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 69 74 65 72   and the.** iter
eb80: 61 74 6f 72 20 69 73 20 6e 6f 74 20 61 20 72 65  ator is not a re
eb90: 76 65 72 73 65 20 64 69 72 65 63 74 69 6f 6e 20  verse direction 
eba0: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
ebb0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
ebc0: 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20  IterNext_None(. 
ebd0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
ec00: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
ec10: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec30: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
ec40: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nce */.  int *pb
ec50: 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20  NewTerm         
ec60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
ec70: 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72   Set for new ter
ec80: 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f  m */.){.  int iO
ec90: 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
eca0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ecb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
ecc0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
ecd0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
ece0: 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
ecf0: 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  t( p->pConfig->e
ed00: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
ed10: 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41  AIL_NONE );..  A
ed20: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
ed30: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
ed40: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
ed50: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f  LeafOffset;..  /
ed60: 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20  * Next entry is 
ed70: 6f 6e 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  on the next page
ed80: 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d   */.  if( pIter-
ed90: 3e 70 53 65 67 20 26 26 20 69 4f 66 66 3e 3d 70  >pSeg && iOff>=p
eda0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
edb0: 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53  eaf ){.    fts5S
edc0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
edd0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
ede0: 28 20 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72  ( p->rc || pIter
edf0: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74  ->pLeaf==0 ) ret
ee00: 75 72 6e 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  urn;.    pIter->
ee10: 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  iRowid = 0;.    
ee20: 69 4f 66 66 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  iOff = 4;.  }.. 
ee30: 20 69 66 28 20 69 4f 66 66 3c 70 49 74 65 72 2d   if( iOff<pIter-
ee40: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29  >iEndofDoclist )
ee50: 7b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  {.    /* Next en
ee60: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75  try is on the cu
ee70: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
ee80: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
ee90: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
eea0: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
eeb0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
eec0: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
eed0: 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72  elta);.    pIter
eee0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
eef0: 69 4f 66 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  iOff;.    pIter-
ef00: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
ef10: 61 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  a;.  }else if( (
ef20: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
ef30: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
ef40: 45 52 4d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ERM)==0 ){.    i
ef50: 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 20 29  f( pIter->pSeg )
ef60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  {.      int nKee
ef70: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
ef80: 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46   iOff!=fts5LeafF
ef90: 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65  irstTermOff(pIte
efa0: 72 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20 20  r->pLeaf) ){.   
efb0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
efc0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
efd0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f  ter->pLeaf->p[iO
efe0: 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
eff0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
f000: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f010: 69 4f 66 66 3b 0a 20 20 20 20 20 20 66 74 73 35  iOff;.      fts5
f020: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
f030: 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29  p, pIter, nKeep)
f040: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f050: 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69     const u8 *pLi
f060: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  st = 0;.      co
f070: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
f080: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
f090: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
f0a0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
f0b0: 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20  ext(p->pHash);. 
f0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
f0d0: 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d  HashScanEntry(p-
f0e0: 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20  >pHash, &zTerm, 
f0f0: 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
f100: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
f110: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f  ==0 ) goto next_
f120: 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20 20 20 20 20  none_eof;.      
f130: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20  pIter->pLeaf->p 
f140: 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
f150: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f160: 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ->nn = nList;.  
f170: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f180: 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
f190: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f1a0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e  EndofDoclist = n
f1b0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
f1c0: 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
f1d0: 28 26 70 2d 3e 72 63 2c 26 70 49 74 65 72 2d 3e  (&p->rc,&pIter->
f1e0: 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65  term, (int)strle
f1f0: 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a  n(zTerm), (u8*)z
f200: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74  Term);.      pIt
f210: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f220: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
f230: 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49  pList, (u64*)&pI
f240: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
f250: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 62 4e    }..    if( pbN
f260: 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54  ewTerm ) *pbNewT
f270: 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  erm = 1;.  }else
f280: 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f  {.    goto next_
f290: 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20  none_eof;.  }.. 
f2a0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
f2b0: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
f2c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 20 6e 65 78 74  .  return;. next
f2d0: 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66 74 73  _none_eof:.  fts
f2e0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
f2f0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
f300: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
f310: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  }.../*.** Advanc
f320: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
f330: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
f340: 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
f350: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
f360: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
f370: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
f380: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
f390: 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63   It .** is not c
f3a0: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
f3b0: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
f3c0: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20  or reaches EOF. 
f3d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
f3e0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
f3f0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
f400: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
f410: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
f420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f430: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
f440: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
f450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f460: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
f470: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
f480: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
f490: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
f4a0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
f4b0: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
f4c0: 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f4e0: 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20  UT: Set for new 
f4f0: 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  term */.){.  Fts
f500: 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
f510: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69  Iter->pLeaf;.  i
f520: 6e 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 62  nt iOff;.  int b
f530: 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69  NewTerm = 0;.  i
f540: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
f550: 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a  u8 *a;.  int n;.
f560: 0a 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77  .  assert( pbNew
f570: 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65  Term==0 || *pbNe
f580: 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  wTerm==0 );.  as
f590: 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
f5a0: 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
f5b0: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a  DETAIL_NONE );..
f5c0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
f5d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
f5e0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74  osition list wit
f5f0: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
f600: 70 61 67 65 2e 20 2a 2f 0a 20 20 61 20 3d 20 70  page. */.  a = p
f610: 4c 65 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70  Leaf->p;.  n = p
f620: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20  Leaf->szLeaf;.. 
f630: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
f640: 4b 28 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66  K(pLeaf);.  iOff
f650: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
f660: 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e  ffset + pIter->n
f670: 50 6f 73 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66  Pos;..  if( iOff
f680: 3c 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  <n ){.    /* The
f690: 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   next entry is o
f6a0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
f6b0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f6c0: 74 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49 74 65  t_nc( iOff<=pIte
f6d0: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
f6e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66   );.    if( iOff
f6f0: 3e 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  >=pIter->iEndofD
f700: 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
f710: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
f720: 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74      if( iOff!=ft
f730: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
f740: 66 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20  ff(pLeaf) ){.   
f750: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
f760: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
f770: 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
f780: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f790: 7b 0a 20 20 20 20 20 20 75 36 34 20 69 44 65 6c  {.      u64 iDel
f7a0: 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ta;.      iOff +
f7b0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
f7c0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
f7d0: 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
f7e0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
f7f0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
f800: 61 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74  assert_nc( iDelt
f810: 61 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a>0 );.    }.   
f820: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f830: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d  set = iOff;..  }
f840: 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
f850: 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 63  pSeg==0 ){.    c
f860: 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
f870: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
f880: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20  ar *zTerm = 0;. 
f890: 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30     int nList = 0
f8a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
f8b0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
f8c0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
f8d0: 52 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65 72 6d  RM) || pbNewTerm
f8e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   );.    if( 0==(
f8f0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
f900: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
f910: 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ERM) ){.      sq
f920: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
f930: 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b  nNext(p->pHash);
f940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
f950: 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
f960: 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d  p->pHash, &zTerm
f970: 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
f980: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f990: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
f9a0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
f9b0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
f9c0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
f9d0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Leaf = 0;.    }e
f9e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
f9f0: 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38  ->pLeaf->p = (u8
fa00: 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  *)pList;.      p
fa10: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
fa20: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
fa30: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
fa40: 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
fa50: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
fa60: 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 2b  Doclist = nList+
fa70: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
fa80: 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
fa90: 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
faa0: 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rm, (int)strlen(
fab0: 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20  zTerm),.        
fac0: 20 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20    (u8*)zTerm);. 
fad0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
fae0: 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
faf0: 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28  tVarint(pList, (
fb00: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
fb10: 77 69 64 29 3b 0a 20 20 20 20 20 20 2a 70 62 4e  wid);.      *pbN
fb20: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
fb30: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
fb40: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  Off = 0;.    /* 
fb50: 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f  Next entry is no
fb60: 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
fb70: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 77 68 69   page */.    whi
fb80: 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  le( iOff==0 ){. 
fb90: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
fba0: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
fbb0: 72 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 20  r);.      pLeaf 
fbc0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
fbd0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d        if( pLeaf=
fbe0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
fbf0: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
fc00: 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  OK(pLeaf);.     
fc10: 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73   if( (iOff = fts
fc20: 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
fc30: 66 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f  ff(pLeaf)) && iO
fc40: 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff<pLeaf->szLeaf
fc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
fc60: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
fc70: 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
fc80: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
fc90: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
fca0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
fcb0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
fcc0: 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ff;..        if(
fcd0: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
fce0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
fcf0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67        pIter->iPg
fd00: 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e  idxOff = pLeaf->
fd10: 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74  szLeaf + fts5Get
fd20: 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20  Varint32(.      
fd30: 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
fd40: 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d  p[pLeaf->szLeaf]
fd50: 2c 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  , pIter->iEndofD
fd60: 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20  oclist.         
fd70: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
fd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
fd90: 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70   if( pLeaf->nn>p
fda0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
fdb0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fdc0: 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66  PgidxOff = pLeaf
fdd0: 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47  ->szLeaf + fts5G
fde0: 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20  etVarint32(.    
fdf0: 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
fe00: 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d  p[pLeaf->szLeaf]
fe10: 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20 29  , iOff.        )
fe20: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
fe30: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
fe40: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74  Off;.        pIt
fe50: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fe60: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
fe70: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
fe80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
fe90: 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c  sert_nc( iOff<pL
fea0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20  eaf->szLeaf );. 
feb0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c       if( iOff>pL
fec0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fed0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
fee0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
fef0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
ff00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
ff10: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
ff20: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
ff30: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
ff40: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
ff50: 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  /.  if( pIter->p
ff60: 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
ff70: 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20  bNewTerm ){.    
ff80: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
ff90: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
ffa0: 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20  R_ONETERM ){.   
ffb0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
ffc0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
ffd0: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  f);.        pIte
ffe0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
fff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10000 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
10010 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
10020 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20   nKeep);.       
10030 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
10040 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
10050 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65          if( pbNe
10060 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
10070 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
10080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10090 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
100a0 67 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20  g could be done 
100b0 62 79 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53  by calling fts5S
100c0 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29  egIterLoadNPos()
100d0 2e 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  . But.      ** t
100e0 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72  his block is par
100f0 74 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72  ticularly perfor
10100 6d 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20  mance critical, 
10110 73 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  so equivalent.  
10120 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69      ** code is i
10130 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a  nlined. .      *
10140 2a 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72  *.      ** Later
10150 3a 20 53 77 69 74 63 68 65 64 20 62 61 63 6b 20  : Switched back 
10160 74 6f 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  to fts5SegIterLo
10170 61 64 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65  adNPos() because
10180 20 69 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20   it supports.   
10190 20 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e     ** detail=non
101a0 65 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61  e mode. Not idea
101b0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
101c0 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20    int nSz;.     
101d0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
101e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
101f0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
10200 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3c 3d 70  ->iLeafOffset<=p
10210 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
10220 29 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73  );.      fts5Fas
10230 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74  tGetVarint32(pIt
10240 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 70 49  er->pLeaf->p, pI
10250 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
10260 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49  , nSz);.      pI
10270 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a  ter->bDel = (nSz
10280 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20   & 0x0001);.    
10290 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20    pIter->nPos = 
102a0 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73  nSz>>1;.      as
102b0 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
102c0 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  nPos>=0 );.    }
102d0 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  .  }.}..#define 
102e0 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29  SWAPVAL(T, a, b)
102f0 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b   { T tmp; tmp=a;
10300 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a   a=b; b=tmp; }..
10310 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e 64 65  #define fts5Inde
10320 78 53 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69  xSkipVarint(a, i
10330 4f 66 66 29 20 7b 20 20 20 20 20 20 20 20 20 20  Off) {          
10340 20 20 5c 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d    \.  int iEnd =
10350 20 69 4f 66 66 2b 39 3b 20 20 20 20 20 20 20 20   iOff+9;        
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 20 5c 0a 20 20 77 68 69 6c 65 28        \.  while(
10380 20 28 61 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78   (a[iOff++] & 0x
10390 38 30 29 20 26 26 20 69 4f 66 66 3c 69 45 6e 64  80) && iOff<iEnd
103a0 20 29 3b 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f   );       \.}../
103b0 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
103c0 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
103d0 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
103e0 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63  t rowid in a doc
103f0 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  list. This.** fu
10400 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
10410 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74  iterator up so t
10420 68 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20  hat iterates in 
10430 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68  reverse order th
10440 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63  rough.** the doc
10450 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
10460 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
10470 52 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65  Reverse(Fts5Inde
10480 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
10490 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
104a0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
104b0 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
104c0 64 78 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  dx;.  Fts5Data *
104d0 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pLast = 0;.  int
104e0 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a   pgnoLast = 0;..
104f0 20 20 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a    if( pDlidx ){.
10500 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
10510 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
10520 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61  egid;.    pgnoLa
10530 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  st = fts5DlidxIt
10540 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
10550 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35      pLast = fts5
10560 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
10570 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
10580 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29  Segid, pgnoLast)
10590 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
105a0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
105b0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
105c0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
105d0 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
105e0 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
105f0 79 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  y, Fts5SegIter.i
10600 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
10610 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
10620 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f  yte of.    ** po
10630 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74  sition-list cont
10640 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ent for the curr
10650 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20  ent rowid. Back 
10660 69 74 20 75 70 20 73 6f 20 74 68 61 74 20 69 74  it up so that it
10670 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74  .    ** points t
10680 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
10690 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
106a0 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a   size field. */.
106b0 20 20 20 20 69 6e 74 20 69 50 6f 73 6c 69 73 74      int iPoslist
106c0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
106d0 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d  >iTermLeafPgno==
106e0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
106f0 20 29 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69   ){.      iPosli
10700 73 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72  st = pIter->iTer
10710 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  mLeafOffset;.   
10720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 50   }else{.      iP
10730 6f 73 6c 69 73 74 20 3d 20 34 3b 0a 20 20 20 20  oslist = 4;.    
10740 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 53  }.    fts5IndexS
10750 6b 69 70 56 61 72 69 6e 74 28 70 4c 65 61 66 2d  kipVarint(pLeaf-
10760 3e 70 2c 20 69 50 6f 73 6c 69 73 74 29 3b 0a 20  >p, iPoslist);. 
10770 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
10780 66 66 73 65 74 20 3d 20 69 50 6f 73 6c 69 73 74  ffset = iPoslist
10790 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
107a0 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
107b0 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72  rue then the lar
107c0 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74  gest rowid for t
107d0 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
107e0 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62  * term may not b
107f0 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  e stored on the 
10800 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f  current page. So
10810 20 73 65 61 72 63 68 20 66 6f 72 77 61 72 64 20   search forward 
10820 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68  to.    ** see wh
10830 65 72 65 20 73 61 69 64 20 72 6f 77 69 64 20 72  ere said rowid r
10840 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20  eally is.  */.  
10850 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e    if( pIter->iEn
10860 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61  dofDoclist>=pLea
10870 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
10880 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20     int pgno;.   
10890 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
108a0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
108b0 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20  pIter->pSeg;..  
108c0 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20      /* The last 
108d0 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
108e0 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  list may not be 
108f0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
10900 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20  age. Search.    
10910 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20    ** forward to 
10920 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f  find the page co
10930 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73  ntaining the las
10940 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20  t rowid.  */.   
10950 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65     for(pgno=pIte
10960 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20  r->iLeafPgno+1; 
10970 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d  !p->rc && pgno<=
10980 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20  pSeg->pgnoLast; 
10990 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pgno++){.       
109a0 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35   i64 iAbs = FTS5
109b0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
109c0 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e  Seg->iSegid, pgn
109d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  o);.        Fts5
109e0 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73  Data *pNew = fts
109f0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 41 62  5DataRead(p, iAb
10a00 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
10a10 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
10a20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54    int iRowid, bT
10a30 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20  ermless;.       
10a40 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35     iRowid = fts5
10a50 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
10a60 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  f(pNew);.       
10a70 20 20 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66     bTermless = f
10a80 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
10a90 73 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  s(pNew);.       
10aa0 20 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b     if( iRowid ){
10ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41  .            SWA
10ac0 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20  PVAL(Fts5Data*, 
10ad0 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20  pNew, pLast);.  
10ae0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61            pgnoLa
10af0 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  st = pgno;.     
10b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10b10 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
10b20 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
10b30 20 20 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d    if( bTermless=
10b40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
10b50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10b60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
10b70 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61   pLast is NULL a
10b80 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
10b90 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  en the last rowi
10ba0 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69  d for this docli
10bb0 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20  st.  ** lies on 
10bc0 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
10bd0 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
10be0 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e  the iterator. In
10bf0 20 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a   this case .  **
10c00 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
10c10 73 65 74 20 69 73 20 61 6c 72 65 61 64 79 20 73  set is already s
10c20 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
10c30 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
10c40 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64   size.  ** field
10c50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10c60 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
10c70 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
10c80 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   page..  **.  **
10c90 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73   Or, if pLast is
10ca0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
10cb0 69 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74  it is the page t
10cc0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
10cd0 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64   last.  ** rowid
10ce0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
10cf0 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 74 65  onfigure the ite
10d00 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74  rator so that it
10d10 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20   points to the. 
10d20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   ** first rowid 
10d30 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20  on this page..  
10d40 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29  */.  if( pLast )
10d50 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
10d60 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
10d70 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
10d80 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  );.    pIter->pL
10d90 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20  eaf = pLast;.   
10da0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
10db0 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  o = pgnoLast;.  
10dc0 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61    iOff = fts5Lea
10dd0 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
10de0 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20  Last);.    iOff 
10df0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
10e00 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d  (&pLast->p[iOff]
10e10 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
10e20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74  iRowid);.    pIt
10e30 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10e40 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28  = iOff;..    if(
10e50 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
10e60 65 73 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20  ess(pLast) ){.  
10e70 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
10e80 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74  fDoclist = pLast
10e90 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
10ea0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
10eb0 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
10ec0 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
10ed0 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20  mOff(pLast);.   
10ee0 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53   }..  }..  fts5S
10ef0 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
10f00 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
10f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
10f20 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
10f30 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
10f40 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20   first rowid of 
10f50 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68  a doclist..** Th
10f60 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
10f70 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  -index associate
10f80 64 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c  d with the final
10f90 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72   term on the cur
10fa0 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49  rent .** page. I
10fb0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
10fc0 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  rm is the last t
10fd0 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  erm on the page,
10fe0 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f   load the .** do
10ff0 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d  clist-index from
11000 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61   disk and initia
11010 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lize an iterator
11020 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69   at (pIter->pDli
11030 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dx)..*/.static v
11040 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
11050 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64  oadDlidx(Fts5Ind
11060 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
11070 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
11080 74 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e  t iSeg = pIter->
11090 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
110a0 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65  int bRev = (pIte
110b0 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
110c0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
110d0 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  ;.  Fts5Data *pL
110e0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
110f0 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c  af; /* Current l
11100 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61  eaf data */..  a
11110 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
11120 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
11130 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20  ER_ONETERM );.  
11140 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
11150 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Dlidx==0 );..  /
11160 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63  * Check if the c
11170 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65  urrent doclist e
11180 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  nds on this page
11190 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65  . If it does, re
111a0 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20  turn.  ** early 
111b0 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20  without loading 
111c0 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
111d0 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73  x (as it belongs
111e0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a   to a different.
111f0 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20    ** term. */.  
11200 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
11210 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
11220 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26  >iLeafPgno .   &
11230 26 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  & pIter->iEndofD
11240 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a  oclist<pLeaf->sz
11250 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72  Leaf .  ){.    r
11260 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49  eturn;.  }..  pI
11270 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74  ter->pDlidx = ft
11280 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
11290 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70  p, bRev, iSeg, p
112a0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
112b0 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  gno);.}../*.** T
112c0 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
112d0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
112e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
112f0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
11300 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20  ins.** no valid 
11310 76 61 6c 75 65 73 20 65 78 63 65 70 74 20 66 6f  values except fo
11320 72 20 74 68 65 20 46 74 73 35 53 65 67 49 74 65  r the Fts5SegIte
11330 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72 20 76  r.pLeaf member v
11340 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a  ariable. This.**
11350 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
11360 65 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  es the leaf page
11370 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61 74 63   for a term matc
11380 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65 72  hing (pTerm/nTer
11390 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  m)..**.** If the
113a0 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
113b0 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  is found on the 
113c0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 69  page, then the i
113d0 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 0a  terator is left.
113e0 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  ** pointing to i
113f0 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  t. If argument b
11400 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  Ge is zero and t
11410 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66  he term is not f
11420 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65  ound,.** the ite
11430 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
11440 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a  inting at EOF..*
11450 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73 20 6e  *.** If bGe is n
11460 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
11470 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69  specified term i
11480 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
11490 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f  n the.** iterato
114a0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
114b0 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  ng to the smalle
114c0 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73  st term in the s
114d0 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69  egment that.** i
114e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
114f0 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
11500 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 74  , even if this t
11510 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  erm is not on th
11520 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 61 67  e.** current pag
11530 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11540 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 0a  d fts5LeafSeek(.
11550 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65    /* Leave any e
11580 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a  rror code here *
11590 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20 20 20  /.  int bGe,    
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
115c0 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20  a >= search */. 
115d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
115e0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
115f0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
11600 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  seek */.  const 
11610 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
11620 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54 65 72  Term      /* Ter
11630 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  m to search for 
11640 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  */.){.  int iOff
11650 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20  ;.  const u8 *a 
11660 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11670 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 20  p;.  int szLeaf 
11680 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11690 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20  szLeaf;.  int n 
116a0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
116b0 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63  nn;..  int nMatc
116c0 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  h = 0;.  int nKe
116d0 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e  ep = 0;.  int nN
116e0 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ew = 0;.  int iT
116f0 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50  ermOff;.  int iP
11700 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  gidx;           
11710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11720 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70  rent offset in p
11730 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45  gidx */.  int bE
11740 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20  ndOfPage = 0;.. 
11750 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
11760 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
11770 69 50 67 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b  iPgidx = szLeaf;
11780 0a 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73  .  iPgidx += fts
11790 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
117a0 69 50 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66  iPgidx], iTermOf
117b0 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54 65  f);.  iOff = iTe
117c0 72 6d 4f 66 66 3b 0a 20 20 69 66 28 20 69 4f 66  rmOff;.  if( iOf
117d0 66 3e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  f>n ){.    p->rc
117e0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
117f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11800 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
11810 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
11820 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20  ut how many new 
11830 62 79 74 65 73 20 61 72 65 20 69 6e 20 74 68 69  bytes are in thi
11840 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74  s term */.    ft
11850 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
11860 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29  2(a, iOff, nNew)
11870 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3c  ;.    if( nKeep<
11880 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  nMatch ){.      
11890 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c  goto search_fail
118a0 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  ed;.    }..    a
118b0 73 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d  ssert( nKeep>=nM
118c0 61 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28 20  atch );.    if( 
118d0 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b  nKeep==nMatch ){
118e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  .      int nCmp;
118f0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
11900 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e      nCmp = MIN(n
11910 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63  New, nTerm-nMatc
11920 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  h);.      for(i=
11930 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b  0; i<nCmp; i++){
11940 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 69  .        if( a[i
11950 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d  Off+i]!=pTerm[nM
11960 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b  atch+i] ) break;
11970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
11980 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20  Match += i;..   
11990 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d     if( nTerm==nM
119a0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
119b0 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20  if( i==nNew ){. 
119c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
119d0 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20  arch_success;.  
119e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
119f0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72         goto sear
11a00 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  ch_failed;.     
11a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
11a20 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61   if( i<nNew && a
11a30 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e  [iOff+i]>pTerm[n
11a40 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20  Match] ){.      
11a50 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
11a60 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
11a70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67    }..    if( iPg
11a80 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  idx>=n ){.      
11a90 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a  bEndOfPage = 1;.
11aa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11ab0 20 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b   }..    iPgidx +
11ac0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11ad0 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b  2(&a[iPgidx], nK
11ae0 65 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f  eep);.    iTermO
11af0 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20  ff += nKeep;.   
11b00 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
11b10 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  ;..    if( iOff>
11b20 3d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =n ){.      p->r
11b30 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
11b40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
11b50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
11b60 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65  ad the nKeep fie
11b70 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ld of the next t
11b80 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  erm. */.    fts5
11b90 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
11ba0 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b  a, iOff, nKeep);
11bb0 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61  .  }.. search_fa
11bc0 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d  iled:.  if( bGe=
11bd0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  =0 ){.    fts5Da
11be0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
11bf0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
11c00 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
11c10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
11c20 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67  se if( bEndOfPag
11c30 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e ){.    do {.  
11c40 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
11c50 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
11c60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
11c70 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  er->pLeaf==0 ) r
11c80 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d  eturn;.      a =
11c90 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
11ca0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
11cb0 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
11cc0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20  Iter->pLeaf)==0 
11cd0 29 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64  ){.        iPgid
11ce0 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  x = pIter->pLeaf
11cf0 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  ->szLeaf;.      
11d00 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
11d10 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
11d20 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67  er->pLeaf->p[iPg
11d30 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20  idx], iOff);.   
11d40 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
11d50 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  || iOff>=pIter->
11d60 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
11d70 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
11d80 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
11d90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11da0 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20            nKeep 
11db0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
11dc0 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  TermOff = iOff;.
11dd0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49            n = pI
11de0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
11df0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
11e00 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11e10 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
11e20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
11e30 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
11e40 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
11e50 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  ( 1 );.  }.. sea
11e60 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20  rch_success:..  
11e70 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
11e80 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
11e90 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
11ea0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
11eb0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
11ec0 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
11ed0 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
11ee0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66  >iLeafPgno;..  f
11ef0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
11f00 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
11f10 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29  m, nKeep, pTerm)
11f20 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
11f30 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
11f40 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
11f50 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
11f60 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e  .  if( iPgidx>=n
11f70 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
11f80 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
11f90 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
11fa0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
11fb0 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
11fc0 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
11fd0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
11fe0 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20  idx], nExtra);. 
11ff0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
12000 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f  Doclist = iTermO
12010 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d  ff + nExtra;.  }
12020 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78  .  pIter->iPgidx
12030 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20  Off = iPgidx;.. 
12040 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
12050 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
12060 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
12070 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
12080 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c 69  ;.}..static sqli
12090 74 65 33 5f 73 74 6d 74 20 2a 66 74 73 35 49 64  te3_stmt *fts5Id
120a0 78 53 65 6c 65 63 74 53 74 6d 74 28 46 74 73 35  xSelectStmt(Fts5
120b0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28  Index *p){.  if(
120c0 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d   p->pIdxSelect==
120d0 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
120e0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
120f0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
12100 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
12110 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 53  tmt(p, &p->pIdxS
12120 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d  elect, sqlite3_m
12130 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
12140 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f 20 46    "SELECT pgno F
12150 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78  ROM '%q'.'%q_idx
12160 27 20 57 48 45 52 45 20 22 0a 20 20 20 20 20 20  ' WHERE ".      
12170 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41 4e 44      "segid=? AND
12180 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42   term<=? ORDER B
12190 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49 4d 49  Y term DESC LIMI
121a0 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  T 1",.          
121b0 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
121c0 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
121d0 20 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   ));.  }.  retur
121e0 6e 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 3b  n p->pIdxSelect;
121f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
12200 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20  lize the object 
12210 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  pIter to point t
12220 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  o term pTerm/nTe
12230 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e  rm within segmen
12240 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74 68  t.** pSeg. If th
12250 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
12260 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78  erm in the index
12270 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
12280 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
12290 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
122a0 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
122b0 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
122c0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
122d0 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
122e0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
122f0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
12300 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12310 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
12320 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
12330 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
12340 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a  egIterSeekInit(.
12350 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
12380 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  d */.  const u8 
12390 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
123a0 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
123b0 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69  o seek to */.  i
123c0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
123e0 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
123f0 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  DEX_XXX flags */
12400 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
12410 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
12420 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
12430 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
12440 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
12450 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
12460 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
12470 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
12480 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20 69  int iPg = 1;.  i
12490 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67 73 20  nt bGe = (flags 
124a0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
124b0 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62  Y_SCAN);.  int b
124c0 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  Dlidx = 0;      
124d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
124e0 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
124f0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a   doclist-index *
12500 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
12510 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d 20 30   *pIdxSelect = 0
12520 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47 65  ;..  assert( bGe
12530 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
12540 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
12550 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73  DESC)==0 );.  as
12560 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e  sert( pTerm && n
12570 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74  Term );.  memset
12580 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
12590 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
125a0 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
125b0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
125c0 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76 61  ck sets stack va
125d0 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68  riable iPg to th
125e0 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  e leaf page numb
125f0 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a  er that may.  **
12600 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70   contain term (p
12610 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20  Term/nTerm), if 
12620 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  it is present in
12630 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f   the segment. */
12640 0a 20 20 70 49 64 78 53 65 6c 65 63 74 20 3d 20  .  pIdxSelect = 
12650 66 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d  fts5IdxSelectStm
12660 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  t(p);.  if( p->r
12670 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  c ) return;.  sq
12680 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
12690 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 70 53  IdxSelect, 1, pS
126a0 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 73  eg->iSegid);.  s
126b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
126c0 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20  (pIdxSelect, 2, 
126d0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51  pTerm, nTerm, SQ
126e0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
126f0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
12700 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 64  sqlite3_step(pId
12710 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  xSelect) ){.    
12720 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65  i64 val = sqlite
12730 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 64  3_column_int(pId
12740 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  xSelect, 0);.   
12750 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76 61 6c   iPg = (int)(val
12760 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69 64 78  >>1);.    bDlidx
12770 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30 30 31   = (val & 0x0001
12780 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d  );.  }.  p->rc =
12790 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
127a0 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  IdxSelect);.  sq
127b0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
127c0 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a  pIdxSelect, 2);.
127d0 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d  .  if( iPg<pSeg-
127e0 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20  >pgnoFirst ){.  
127f0 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67    iPg = pSeg->pg
12800 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c  noFirst;.    bDl
12810 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  idx = 0;.  }..  
12820 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12830 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74   = iPg - 1;.  ft
12840 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
12850 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  e(p, pIter);..  
12860 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
12870 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61 66   ){.    fts5Leaf
12880 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49 74  Seek(p, bGe, pIt
12890 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  er, pTerm, nTerm
128a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
128b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
128c0 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  & bGe==0 ){.    
128d0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
128e0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
128f0 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49  TERM;.    if( pI
12900 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
12910 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
12920 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
12930 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  DESC ){.        
12940 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
12950 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
12960 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERSE;.      }.  
12970 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29      if( bDlidx )
12980 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
12990 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70  gIterLoadDlidx(p
129a0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
129b0 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  }.      if( flag
129c0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
129d0 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
129e0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
129f0 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72 29  everse(p, pIter)
12a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12a10 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
12a20 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74  erSetNext(p, pIt
12a30 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  er);..  /* Eithe
12a40 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  r:.  **.  **   1
12a50 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  ) an error has o
12a60 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a  ccurred, or.  **
12a70 20 20 20 32 29 20 74 68 65 20 69 74 65 72 61 74     2) the iterat
12a80 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
12a90 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20 74  , or.  **   3) t
12aa0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12ab0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77  ts to an entry w
12ac0 69 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ith term (pTerm/
12ad0 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20  nTerm), or.  ** 
12ae0 20 20 34 29 20 74 68 65 20 46 54 53 35 49 4e 44    4) the FTS5IND
12af0 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66 6c  EX_QUERY_SCAN fl
12b00 61 67 20 77 61 73 20 73 65 74 20 61 6e 64 20 74  ag was set and t
12b10 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12b20 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  ts.  **      to 
12b30 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
12b40 74 65 72 6d 20 67 72 65 61 74 65 72 20 74 68 61  term greater tha
12b50 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28 70  n or equal to (p
12b60 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a  Term/nTerm)..  *
12b70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  /.  assert( p->r
12b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  c!=SQLITE_OK    
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20        /* 1 */.  
12bc0 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   || pIter->pLeaf
12bd0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20    /* 2 */.   || 
12c10 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
12c20 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65  eBlob(&pIter->te
12c30 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, pTerm, nTerm
12c40 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f 2a  )==0          /*
12c50 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65   3 */.   || (bGe
12c60 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
12c70 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
12c80 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
12c90 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a  Term)>0)  /* 4 *
12ca0 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  /.  );.}../*.** 
12cb0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
12cc0 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
12cd0 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
12ce0 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
12cf0 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
12d00 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
12d10 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
12d20 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73   term in the has
12d30 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a  h-table, the .**
12d40 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74   iterator is set
12d50 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   to EOF..**.** I
12d60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12d70 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
12d80 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
12d90 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
12da0 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
12db0 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
12dc0 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
12dd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12de0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
12df0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
12e00 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
12e10 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73  rHashInit(.  Fts
12e20 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e40 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  FTS5 backend */.
12e50 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
12e60 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
12e70 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
12e80 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
12e90 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
12ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
12eb0 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
12ec0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
12ed0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ef0 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
12f00 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ate */.){.  cons
12f10 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
12f20 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30  .  int nList = 0
12f30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20  ;.  const u8 *z 
12f40 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  = 0;.  int n = 0
12f50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
12f60 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72  pHash );.  asser
12f70 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
12f80 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  _OK );..  if( pT
12f90 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  erm==0 || (flags
12fa0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
12fb0 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20  RY_SCAN) ){.    
12fc0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
12fd0 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
12fe0 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
12ff0 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
13000 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  erm);.    sqlite
13010 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
13020 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  ry(p->pHash, (co
13030 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26  nst char**)&z, &
13040 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
13050 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e      n = (z ? (in
13060 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20  t)strlen((const 
13070 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20  char*)z) : 0);. 
13080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
13090 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
130a0 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
130b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
130c0 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48  5HashQuery(p->pH
130d0 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
130e0 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  *)pTerm, nTerm, 
130f0 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
13100 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a  .    z = pTerm;.
13110 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20      n = nTerm;. 
13120 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20   }..  if( pList 
13130 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
13140 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69  *pLeaf;.    sqli
13150 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
13160 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
13170 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20  >term, n, z);.  
13180 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64    pLeaf = fts5Id
13190 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
131a0 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20  f(Fts5Data));.  
131b0 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
131c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65   return;.    pLe
131d0 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
131e0 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e  st;.    pLeaf->n
131f0 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
13200 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70  f = nList;.    p
13210 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c  Iter->pLeaf = pL
13220 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  eaf;.    pIter->
13230 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
13240 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 65 61  s5GetVarint(pLea
13250 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74  f->p, (u64*)&pIt
13260 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
13270 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
13280 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e  clist = pLeaf->n
13290 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67  n;..    if( flag
132a0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
132b0 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
132c0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
132d0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
132e0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74  EVERSE;.      ft
132f0 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
13300 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
13310 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
13320 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
13330 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
13340 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
13350 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e   fts5SegIterSetN
13360 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  ext(p, pIter);.}
13370 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
13380 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
13390 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
133a0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
133b0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
133c0 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74  rClear(Fts5SegIt
133d0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
133e0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
133f0 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  ter->term);.  ft
13400 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
13410 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66  ter->pLeaf);.  f
13420 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
13430 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29  Iter->pNextLeaf)
13440 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  ;.  fts5DlidxIte
13450 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c  rFree(pIter->pDl
13460 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  idx);.  sqlite3_
13470 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77  free(pIter->aRow
13480 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d  idOffset);.  mem
13490 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
134a0 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
134b0 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ));.}..#ifdef SQ
134c0 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a  LITE_DEBUG../*.*
134d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
134e0 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
134f0 6f 66 20 74 68 65 20 62 69 67 20 61 73 73 65 72  of the big asser
13500 74 28 29 20 70 72 6f 63 65 64 75 72 65 20 69 6d  t() procedure im
13510 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20  plemented by.** 
13520 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
13530 74 65 72 53 65 74 75 70 28 29 2e 20 49 74 20 65  terSetup(). It e
13540 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
13550 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c 79  result currently
13560 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70   stored.** in *p
13570 52 65 73 20 69 73 20 74 68 65 20 63 6f 72 72 65  Res is the corre
13580 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  ct result of com
13590 70 61 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  paring the curre
135a0 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  nt positions of 
135b0 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61  the.** two itera
135c0 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
135d0 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 43  void fts5AssertC
135e0 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
135f0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
13600 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74  er, .  Fts5SegIt
13610 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65  er *p1,.  Fts5Se
13620 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73  gIter *p2,.  Fts
13630 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29  5CResult *pRes.)
13640 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20  {.  int i1 = p1 
13650 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20  - pIter->aSeg;. 
13660 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70   int i2 = p2 - p
13670 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69  Iter->aSeg;..  i
13680 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20  f( p1->pLeaf || 
13690 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  p2->pLeaf ){.   
136a0 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d   if( p1->pLeaf==
136b0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
136c0 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
136d0 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i2 );.    }else
136e0 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
136f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
13700 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
13710 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i1 );.    }else
13720 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e  {.      int nMin
13730 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e   = MIN(p1->term.
13740 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a  n, p2->term.n);.
13750 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
13760 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e  memcmp(p1->term.
13770 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e  p, p2->term.p, n
13780 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Min);.      if( 
13790 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70  res==0 ) res = p
137a0 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e  1->term.n - p2->
137b0 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69  term.n;..      i
137c0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
137d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
137e0 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b  s->bTermEq==1 );
137f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13800 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d   p1->iRowid!=p2-
13810 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  >iRowid );.     
13820 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
13830 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77  Rowid > p2->iRow
13840 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13850 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20  ) ? -1 : 1;.    
13860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13870 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
13880 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20  TermEq==0 );.   
13890 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
138a0 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
138b0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
138c0 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
138d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
138e0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
138f0 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
13900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13910 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
13920 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
13930 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
13940 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
13950 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c   when this modul
13960 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64  e.** is compiled
13970 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
13980 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13990 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20   essentially an 
139a0 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
139b0 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76  tement used to v
139c0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
139d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
139e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
139f0 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72  rray.** are corr
13a00 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
13a10 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d 75  oid fts5AssertMu
13a20 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74 73  ltiIterSetup(Fts
13a30 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
13a40 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
13a50 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
13a70 65 67 49 74 65 72 20 2a 70 46 69 72 73 74 20 3d  egIter *pFirst =
13a80 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
13a90 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
13aa0 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e  iFirst ];.    in
13ab0 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t i;..    assert
13ac0 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65 61 66  ( (pFirst->pLeaf
13ad0 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73  ==0)==pIter->bas
13ae0 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f  e.bEof );..    /
13af0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70 49 74  * Check that pIt
13b00 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13b10 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
13b20 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  y. */.    for(i=
13b30 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
13b40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  ; i++){.      Ft
13b50 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13b60 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
13b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13b80 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20 20 20  1==pFirst .     
13b90 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65        || p1->pLe
13ba0 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  af==0 .         
13bb0 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
13bc0 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74 2d 3e  ompare(&pFirst->
13bd0 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29  term, &p1->term)
13be0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13bf0 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  p1->iRowid==pIte
13c00 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
13c10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
13c20 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  1->iRowid<pIter-
13c30 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
13c40 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 20 20  pIter->bRev.    
13c50 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
13c60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
13c70 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20  ->nSeg; i+=2){. 
13c80 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13c90 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
13ca0 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74  Seg[i];.      Ft
13cb0 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20  s5SegIter *p2 = 
13cc0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31  &pIter->aSeg[i+1
13cd0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
13ce0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13cf0 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74  ter->aFirst[(pIt
13d00 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20  er->nSeg + i) / 
13d10 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73  2];.      fts5As
13d20 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
13d30 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
13d40 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
13d50 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ..    for(i=1; i
13d60 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20  <(pIter->nSeg / 
13d70 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  2); i+=2){.     
13d80 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
13d90 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13da0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13db0 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  *2].iFirst ];.  
13dc0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13dd0 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
13de0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
13df0 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20  t[i*2+1].iFirst 
13e00 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
13e10 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13e20 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
13e30 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
13e40 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
13e50 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
13e60 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRes);.    }.  }
13e70 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
13e80 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  e fts5AssertMult
13e90 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a  iIterSetup(x,y).
13ea0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
13eb0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
13ec0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70  necessary to pop
13ed0 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69  ulate pIter->aFi
13ee0 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a  rst[iOut]..**.**
13ef0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
13f00 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
13f10 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
13f20 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65  he index of an e
13f30 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ntry.** in the p
13f40 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72  Iter->aSeg[] arr
13f50 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e  ay that is (a) n
13f60 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28  ot at EOF, and (
13f70 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  b) pointing.** t
13f80 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  o a key that is 
13f90 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
13fa0 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70  nother, higher p
13fb0 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67  riority, .** seg
13fc0 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e  ment-iterator in
13fd0 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b   the pSeg->aSeg[
13fe0 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
13ff0 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
14000 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74  IterDoCompare(Ft
14010 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  s5Iter *pIter, i
14020 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20  nt iOut){.  int 
14030 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i1;             
14040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14050 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e  ndex of left-han
14060 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
14070 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20  .  int i2;      
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
140a0 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
140b0 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
140c0 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74  Res;.  Fts5SegIt
140d0 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20  er *p1;         
140e0 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
140f0 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
14100 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
14110 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20 20   *p2;           
14120 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
14130 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
14140 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
14150 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
14160 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20  aFirst[iOut];.. 
14170 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49   assert( iOut<pI
14180 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75  ter->nSeg && iOu
14190 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
141a0 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
141b0 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  || pIter->bRev==
141c0 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74  1 );..  if( iOut
141d0 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32  >=(pIter->nSeg/2
141e0 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69  ) ){.    i1 = (i
141f0 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65  Out - pIter->nSe
14200 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32  g/2) * 2;.    i2
14210 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c   = i1 + 1;.  }el
14220 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74  se{.    i1 = pIt
14230 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
14240 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69  2].iFirst;.    i
14250 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  2 = pIter->aFirs
14260 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72  t[iOut*2+1].iFir
14270 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26  st;.  }.  p1 = &
14280 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b  pIter->aSeg[i1];
14290 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  .  p2 = &pIter->
142a0 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65  aSeg[i2];..  pRe
142b0 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a  s->bTermEq = 0;.
142c0 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d    if( p1->pLeaf=
142d0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
142e0 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20 45  /* If p1 is at E
142f0 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
14300 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   i2;.  }else if(
14310 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p2->pLeaf==0 ){
14320 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73       /* If p2 is
14330 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
14340 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73  Res = i1;.  }els
14350 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  e{.    int res =
14360 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
14370 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70  re(&p1->term, &p
14380 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66  2->term);.    if
14390 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
143a0 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31 20    assert( i2>i1 
143b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
143c0 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   i2!=0 );.      
143d0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20  pRes->bTermEq = 
143e0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  1;.      if( p1-
143f0 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f  >iRowid==p2->iRo
14400 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70  wid ){.        p
14410 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44  1->bDel = p2->bD
14420 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  el;.        retu
14430 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20  rn i2;.      }. 
14440 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
14450 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
14460 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
14470 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20  ev) ? -1 : +1;. 
14480 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
14490 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69   res!=0 );.    i
144a0 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
144b0 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20    iRes = i1;.   
144c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
144d0 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20  es = i2;.    }. 
144e0 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72   }..  pRes->iFir
144f0 73 74 20 3d 20 28 75 31 36 29 69 52 65 73 3b 0a  st = (u16)iRes;.
14500 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
14510 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65  *.** Move the se
14520 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69  g-iter so that i
14530 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
14540 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
14550 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a  age iLeafPgno..*
14560 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
14570 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67   if leaf iLeafPg
14580 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  no does not exis
14590 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  t or contains no
145a0 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
145b0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
145c0 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46  terGotoPage(.  F
145d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
145f0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
14600 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
14610 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
14620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14630 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
14640 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  e */.  int iLeaf
14650 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74  Pgno.){.  assert
14660 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
14670 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  r->iLeafPgno );.
14680 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f  .  if( iLeafPgno
14690 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67  >pIter->pSeg->pg
146a0 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
146b0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
146c0 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
146d0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
146e0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
146f0 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
14700 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20  NextLeaf = 0;.  
14710 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
14720 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31  no = iLeafPgno-1
14730 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
14740 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
14750 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
14760 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
14770 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61  K || pIter->iLea
14780 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f  fPgno==iLeafPgno
14790 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   );..    if( p->
147a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
147b0 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
147c0 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
147d0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
147e0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49        int n = pI
147f0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
14800 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20  af;..      iOff 
14810 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
14820 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d 3e 70  owidOff(pIter->p
14830 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
14840 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e   iOff<4 || iOff>
14850 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =n ){.        p-
14860 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
14870 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
14880 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
14890 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
148a0 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
148b0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
148c0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
148d0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
148e0 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  f;.        fts5S
148f0 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
14900 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14910 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
14920 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
14930 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
14940 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
14950 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74  rgument until it
14960 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61   is at or .** pa
14970 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20  st rowid iFrom. 
14980 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
14990 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d  e value of iFrom
149a0 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
149b0 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61  s.** always adva
149c0 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e  nced at least on
149d0 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
149e0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
149f0 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
14a00 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
14a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14a20 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
14a30 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
14a40 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
14a50 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14a60 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
14a70 20 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20    i64 iMatch    
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65    /* Advance ite
14aa0 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74  rator at least t
14ab0 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20  his far */.){.  
14ac0 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65  int bRev = (pIte
14ad0 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
14ae0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
14af0 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ;.  Fts5DlidxIte
14b00 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
14b10 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74  r->pDlidx;.  int
14b20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74   iLeafPgno = pIt
14b30 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
14b40 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a   int bMove = 1;.
14b50 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
14b60 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
14b70 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
14b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
14b90 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61  r->pDlidx );.  a
14ba0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
14bb0 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52  eaf );..  if( bR
14bc0 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ev==0 ){.    whi
14bd0 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
14be0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
14bf0 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73 35 44   && iMatch>fts5D
14c00 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
14c10 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  lidx) ){.      i
14c20 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
14c30 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
14c40 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
14c50 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
14c60 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
14c70 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
14c80 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d  LeafPgno>=pIter-
14c90 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d  >iLeafPgno || p-
14ca0 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >rc );.    if( i
14cb0 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
14cc0 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
14cd0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47 6f     fts5SegIterGo
14ce0 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72 2c  toPage(p, pIter,
14cf0 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20   iLeafPgno);.   
14d00 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20     bMove = 0;.  
14d10 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
14d20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14d30 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a  pNextLeaf==0 );.
14d40 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 61 74      assert( iMat
14d50 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  ch<pIter->iRowid
14d60 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   );.    while( !
14d70 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
14d80 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
14d90 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64 78 49  Match<fts5DlidxI
14da0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
14db0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
14dc0 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70  idxIterPrev(p, p
14dd0 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
14de0 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74    iLeafPgno = ft
14df0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
14e00 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61 73  pDlidx);..    as
14e10 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49  sert( fts5DlidxI
14e20 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
14e30 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d  ) || iLeafPgno<=
14e40 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14e50 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65   );..    if( iLe
14e60 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c  afPgno<pIter->iL
14e70 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
14e80 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
14e90 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b  o = iLeafPgno+1;
14ea0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
14eb0 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
14ec0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
14ed0 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20    bMove = 0;.   
14ee0 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
14ef0 20 20 69 66 28 20 62 4d 6f 76 65 20 26 26 20 70    if( bMove && p
14f00 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14f10 29 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 28 70  ) pIter->xNext(p
14f20 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  , pIter, 0);.   
14f30 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
14f40 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
14f50 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26    if( bRev==0 &&
14f60 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d   pIter->iRowid>=
14f70 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
14f80 20 20 20 20 69 66 28 20 62 52 65 76 21 3d 30 20      if( bRev!=0 
14f90 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  && pIter->iRowid
14fa0 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
14fb0 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b  ;.    bMove = 1;
14fc0 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63  .  }while( p->rc
14fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d  ==SQLITE_OK );.}
14fe0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
14ff0 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
15000 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
15010 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
15020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15030 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
15040 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  e(Fts5Iter *pIte
15050 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
15060 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
15070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
15080 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  er->nSeg; i++){.
15090 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
150a0 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61  rClear(&pIter->a
150b0 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Seg[i]);.    }. 
150c0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
150d0 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
150e0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66 74 73  Struct);.    fts
150f0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
15100 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
15110 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15120 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
15130 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
15140 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
15150 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
15180 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
15190 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49 74  thin */.  Fts5It
151a0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
151b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
151c0 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20  rator to update 
151d0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66  aFirst[] array f
151e0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61  or */.  int iCha
151f0 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  nged,           
15200 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15210 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72   of sub-iterator
15220 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a   just advanced *
15230 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20  /.  int iMinset 
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65      /* Minimum e
15260 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d  ntry in aFirst[]
15270 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20   to set */.){.  
15280 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28  int i;.  for(i=(
15290 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61  pIter->nSeg+iCha
152a0 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e  nged)/2; i>=iMin
152b0 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  set && p->rc==SQ
152c0 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b  LITE_OK; i=i/2){
152d0 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20  .    int iEq;.  
152e0 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
152f0 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
15300 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20 29  are(pIter, i)) )
15310 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
15320 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
15330 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20  er->aSeg[iEq];. 
15340 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
15360 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65  .      pSeg->xNe
15370 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
15380 20 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d        i = pIter-
15390 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20  >nSeg + iEq;.   
153a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
153b0 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68  Sub-iterator iCh
153c0 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f  anged of iterato
153d0 72 20 70 49 74 65 72 20 68 61 73 20 6a 75 73 74  r pIter has just
153e0 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20   been advanced. 
153f0 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e  It still.** poin
15400 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  ts to the same t
15410 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73  erm though - jus
15420 74 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  t a different ro
15430 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  wid. This functi
15440 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  on.** attempts t
15450 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e  o update the con
15460 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74  tents of the pIt
15470 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63  er->aFirst[] acc
15480 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20  ordingly..** If 
15490 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65  it does so succe
154a0 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65  ssfully, 0 is re
154b0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
154c0 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  e 1..**.** If no
154d0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
154e0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73  ed, the caller s
154f0 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d  hould call fts5M
15500 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
15510 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65  ().** on the ite
15520 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54  rator instead. T
15530 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  hat function doe
15540 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
15550 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a  is one, except.*
15560 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c 73 20  * that it deals 
15570 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69  with more compli
15580 63 61 74 65 64 20 63 61 73 65 73 20 61 73 20 77  cated cases as w
15590 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ell..*/ .static 
155a0 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
155b0 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20  rAdvanceRowid(. 
155c0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
155d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
155e0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
155f0 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
15600 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
15610 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15630 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
15640 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
15650 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73 35 53  anced */.  Fts5S
15660 65 67 49 74 65 72 20 2a 2a 70 70 46 69 72 73 74  egIter **ppFirst
15670 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  .){.  Fts5SegIte
15680 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72  r *pNew = &pIter
15690 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d  ->aSeg[iChanged]
156a0 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69  ;..  if( pNew->i
156b0 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53  Rowid==pIter->iS
156c0 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c  witchRowid.   ||
156d0 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70   (pNew->iRowid<p
156e0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
156f0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
15700 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
15710 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
15720 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65   *pOther = &pIte
15730 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64  r->aSeg[iChanged
15740 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20   ^ 0x0001];.    
15750 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
15760 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62 52 65  wid = pIter->bRe
15770 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  v ? SMALLEST_INT
15780 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54  64 : LARGEST_INT
15790 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 70  64;.    for(i=(p
157a0 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e  Iter->nSeg+iChan
157b0 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32  ged)/2; 1; i=i/2
157c0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ){.      Fts5CRe
157d0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
157e0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
157f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15800 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20  New->pLeaf );.  
15810 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
15820 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20  ->bTermEq==0 || 
15830 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b  pOther->pLeaf );
15840 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ..      if( pRes
15850 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20  ->bTermEq ){.   
15860 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69       if( pNew->i
15870 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69  Rowid==pOther->i
15880 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
15890 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
158a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
158b0 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70  pOther->iRowid>p
158c0 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49  New->iRowid)==pI
158d0 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  ter->bRev ){.   
158e0 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53         pIter->iS
158f0 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74  witchRowid = pOt
15900 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  her->iRowid;.   
15910 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
15920 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  ther;.        }e
15930 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
15940 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69  >iRowid>pIter->i
15950 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
15960 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  ter->bRev ){.   
15970 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53         pIter->iS
15980 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74  witchRowid = pOt
15990 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  her->iRowid;.   
159a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
159b0 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73       pRes->iFirs
159c0 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77 20 2d  t = (u16)(pNew -
159d0 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20   pIter->aSeg);. 
159e0 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20       if( i==1 ) 
159f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f  break;..      pO
15a00 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
15a10 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
15a20 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69  st[i ^ 0x0001].i
15a30 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20  First ];.    }. 
15a40 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74 20 3d   }..  *ppFirst =
15a50 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20   pNew;.  return 
15a60 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
15a70 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20  the pIter->bEof 
15a80 76 61 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f  variable based o
15a90 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  n the state of t
15aa0 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73  he sub-iterators
15ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15ac0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
15ad0 74 45 6f 66 28 46 74 73 35 49 74 65 72 20 2a 70  tEof(Fts5Iter *p
15ae0 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
15af0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
15b00 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
15b10 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15b20 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62  st ];.  pIter->b
15b30 61 73 65 2e 62 45 6f 66 20 3d 20 70 53 65 67 2d  ase.bEof = pSeg-
15b40 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74  >pLeaf==0;.  pIt
15b50 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
15b60 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
15b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
15b80 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
15b90 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
15ba0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
15bb0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
15bc0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
15bd0 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e  in Fts5Index.rc.
15be0 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63   It is not .** c
15bf0 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
15c00 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
15c10 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20  or reaches EOF, 
15c20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  or if it is alre
15c30 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77  ady at .** EOF w
15c40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
15c50 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
15c60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15c70 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20  MultiIterNext(. 
15c80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
15c90 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
15ca0 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20  r,.  int bFrom, 
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
15cd0 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69  argument iFrom i
15ce0 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34  s valid */.  i64
15cf0 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20   iFrom          
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d10 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74  Advance at least
15d20 20 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20   as far as this 
15d30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55 73 65  */.){.  int bUse
15d40 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20  From = bFrom;.  
15d50 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
15d60 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  ase.bEof==0 );. 
15d70 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
15d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d90 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
15da0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15db0 69 72 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e  irst;.    int bN
15dc0 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  ewTerm = 0;.    
15dd0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15de0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
15df0 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 61 73  [iFirst];.    as
15e00 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
15e10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
15e20 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70 53  ( bUseFrom && pS
15e30 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20  eg->pDlidx ){.  
15e40 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
15e50 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c  extFrom(p, pSeg,
15e60 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c   iFrom);.    }el
15e70 73 65 7b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  se{.      pSeg->
15e80 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  xNext(p, pSeg, &
15e90 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 7d  bNewTerm);.    }
15ea0 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ..    if( pSeg->
15eb0 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77  pLeaf==0 || bNew
15ec0 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20 66 74  Term .     || ft
15ed0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
15ee0 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69  ceRowid(pIter, i
15ef0 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20  First, &pSeg).  
15f00 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d    ){.      fts5M
15f10 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
15f20 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
15f30 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 66 74 73  t, 1);.      fts
15f40 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
15f50 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70  (pIter);.      p
15f60 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
15f70 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
15f80 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20  [1].iFirst];.   
15f90 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
15fa0 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
15fb0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 41      }..    fts5A
15fc0 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
15fd0 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  tup(p, pIter);. 
15fe0 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 3d     assert( pSeg=
15ff0 3d 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49  =&pIter->aSeg[pI
16000 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
16010 46 69 72 73 74 5d 20 26 26 20 70 53 65 67 2d 3e  First] && pSeg->
16020 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 69 66 28  pLeaf );.    if(
16030 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70   pIter->bSkipEmp
16040 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d 3e 6e  ty==0 || pSeg->n
16050 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 70 49 74  Pos ){.      pIt
16060 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28  er->xSetOutputs(
16070 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20  pIter, pSeg);.  
16080 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
16090 7d 0a 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d  }.    bUseFrom =
160a0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
160b0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
160c0 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74 73  IterNext2(.  Fts
160d0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
160e0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  s5Iter *pIter,. 
160f0 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66   /* OUT: True if
16120 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65 77 20   *might* be new 
16130 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  term */.){.  ass
16140 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53 6b 69  ert( pIter->bSki
16150 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66 28 20  pEmpty );.  if( 
16160 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16170 20 29 7b 0a 20 20 20 20 2a 70 62 4e 65 77 54 65   ){.    *pbNewTe
16180 72 6d 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a  rm = 0;.    do{.
16190 20 20 20 20 20 20 69 6e 74 20 69 46 69 72 73 74        int iFirst
161a0 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
161b0 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20  [1].iFirst;.    
161c0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
161d0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
161e0 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  eg[iFirst];.    
161f0 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
16200 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   0;..      asser
16210 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
16220 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65  _OK );.      pSe
16230 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67  g->xNext(p, pSeg
16240 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20  , &bNewTerm);.  
16250 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
16260 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65  eaf==0 || bNewTe
16270 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74  rm .       || ft
16280 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
16290 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69  ceRowid(pIter, i
162a0 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20  First, &pSeg).  
162b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66      ){.        f
162c0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
162d0 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69  nced(p, pIter, i
162e0 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  First, 1);.     
162f0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
16300 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20  SetEof(pIter);. 
16310 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72         *pbNewTer
16320 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  m = 1;.      }. 
16330 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d       fts5AssertM
16340 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
16350 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77   pIter);..    }w
16360 68 69 6c 65 28 20 66 74 73 35 4d 75 6c 74 69 49  hile( fts5MultiI
16370 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49  terIsEmpty(p, pI
16380 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  ter) );.  }.}..s
16390 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
163a0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
163b0 6f 70 28 46 74 73 35 49 74 65 72 20 2a 70 55 6e  op(Fts5Iter *pUn
163c0 75 73 65 64 31 2c 20 46 74 73 35 53 65 67 49 74  used1, Fts5SegIt
163d0 65 72 20 2a 70 55 6e 75 73 65 64 32 29 7b 0a 20  er *pUnused2){. 
163e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28 70   UNUSED_PARAM2(p
163f0 55 6e 75 73 65 64 31 2c 20 70 55 6e 75 73 65 64  Unused1, pUnused
16400 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74  2);.}..static Ft
16410 73 35 49 74 65 72 20 2a 66 74 73 35 4d 75 6c 74  s5Iter *fts5Mult
16420 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74  iIterAlloc(.  Ft
16430 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16450 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
16460 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
16470 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b  */.  int nSeg.){
16480 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65  .  Fts5Iter *pNe
16490 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20  w;.  int nSlot; 
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66       /* Power of
164c0 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a   two >= nSeg */.
164d0 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20  .  for(nSlot=2; 
164e0 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f  nSlot<nSeg; nSlo
164f0 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e  t=nSlot*2);.  pN
16500 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ew = fts5IdxMall
16510 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69 7a  oc(p, .      siz
16520 65 6f 66 28 46 74 73 35 49 74 65 72 29 20 2b 20  eof(Fts5Iter) + 
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20   /* pNew */.    
16550 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67    sizeof(Fts5Seg
16560 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74 2d 31  Iter) * (nSlot-1
16570 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61  ) +   /* pNew->a
16580 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73  Seg[] */.      s
16590 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73 75 6c  izeof(Fts5CResul
165a0 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20  t) * nSlot      
165b0 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72     /* pNew->aFir
165c0 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  st[] */.  );.  i
165d0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
165e0 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f  New->nSeg = nSlo
165f0 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 46 69  t;.    pNew->aFi
16600 72 73 74 20 3d 20 28 46 74 73 35 43 52 65 73 75  rst = (Fts5CResu
16610 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b  lt*)&pNew->aSeg[
16620 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e 65 77  nSlot];.    pNew
16630 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20  ->pIndex = p;.  
16640 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70    pNew->xSetOutp
16650 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
16660 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20  tOutputs_Noop;. 
16670 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
16680 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
16690 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c   fts5PoslistCall
166a0 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
166b0 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20 76  x *pUnused, .  v
166c0 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a  oid *pContext, .
166d0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
166e0 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
166f0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
16700 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16710 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16720 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16730 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  k>0 ){.    fts5B
16740 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
16750 6c 6f 62 28 28 46 74 73 35 42 75 66 66 65 72 2a  lob((Fts5Buffer*
16760 29 70 43 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e  )pContext, pChun
16770 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a  k, nChunk);.  }.
16780 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
16790 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  t PoslistCallbac
167a0 6b 43 74 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c  kCtx PoslistCall
167b0 62 61 63 6b 43 74 78 3b 0a 73 74 72 75 63 74 20  backCtx;.struct 
167c0 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
167d0 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65  tx {.  Fts5Buffe
167e0 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20  r *pBuf;        
167f0 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
16800 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20   to this buffer 
16810 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
16820 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20  *pColset;       
16830 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
16840 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69 73   matches to this
16850 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
16860 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16880 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a  See above */.};.
16890 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
168a0 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
168b0 78 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  x PoslistOffsets
168c0 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c  Ctx;.struct Posl
168d0 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 7b 0a  istOffsetsCtx {.
168e0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
168f0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
16900 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74    /* Append to t
16910 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
16920 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
16930 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
16940 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63  /* Restrict matc
16950 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75  hes to this colu
16960 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 61  mn */.  int iRea
16970 64 3b 0a 20 20 69 6e 74 20 69 57 72 69 74 65 3b  d;.  int iWrite;
16980 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a  .};../*.** TODO:
16990 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65 20   Make this more 
169a0 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74  efficient!.*/.st
169b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
169c0 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46 74 73  exColsetTest(Fts
169d0 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
169e0 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
169f0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
16a00 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
16a10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
16a20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69  pColset->aiCol[i
16a30 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e  ]==iCol ) return
16a40 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
16a50 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
16a60 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66  id fts5PoslistOf
16a70 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 28 0a 20  fsetsCallback(. 
16a80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e 75   Fts5Index *pUnu
16a90 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  sed, .  void *pC
16aa0 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74  ontext, .  const
16ab0 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
16ac0 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73   nChunk.){.  Pos
16ad0 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 2a  listOffsetsCtx *
16ae0 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 4f  pCtx = (PoslistO
16af0 66 66 73 65 74 73 43 74 78 2a 29 70 43 6f 6e 74  ffsetsCtx*)pCont
16b00 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ext;.  UNUSED_PA
16b10 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
16b20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e  assert_nc( nChun
16b30 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43  k>=0 );.  if( nC
16b40 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 6e  hunk>0 ){.    in
16b50 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  t i = 0;.    whi
16b60 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  le( i<nChunk ){.
16b70 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a        int iVal;.
16b80 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
16b90 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 68 75  etVarint32(&pChu
16ba0 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20  nk[i], iVal);.  
16bb0 20 20 20 20 69 56 61 6c 20 2b 3d 20 70 43 74 78      iVal += pCtx
16bc0 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a 20 20 20  ->iRead - 2;.   
16bd0 20 20 20 70 43 74 78 2d 3e 69 52 65 61 64 20 3d     pCtx->iRead =
16be0 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 66 28   iVal;.      if(
16bf0 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
16c00 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73  Test(pCtx->pCols
16c10 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a 20 20 20  et, iVal) ){.   
16c20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
16c30 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
16c40 70 43 74 78 2d 3e 70 42 75 66 2c 20 69 56 61 6c  pCtx->pBuf, iVal
16c50 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e 69 57 72   + 2 - pCtx->iWr
16c60 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  ite);.        pC
16c70 74 78 2d 3e 69 57 72 69 74 65 20 3d 20 69 56 61  tx->iWrite = iVa
16c80 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
16c90 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
16ca0 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 46  oid fts5PoslistF
16cb0 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20  ilterCallback(. 
16cc0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e 75   Fts5Index *pUnu
16cd0 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  sed,.  void *pCo
16ce0 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20  ntext, .  const 
16cf0 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
16d00 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c  nChunk.){.  Posl
16d10 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a  istCallbackCtx *
16d20 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 43  pCtx = (PoslistC
16d30 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e  allbackCtx*)pCon
16d40 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50  text;.  UNUSED_P
16d50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
16d60 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75   assert_nc( nChu
16d70 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  nk>=0 );.  if( n
16d80 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f  Chunk>0 ){.    /
16d90 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75 67 68  * Search through
16da0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72   to find the fir
16db0 73 74 20 76 61 72 69 6e 74 20 77 69 74 68 20 76  st varint with v
16dc0 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69 73 20  alue 1. This is 
16dd0 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  the.    ** start
16de0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 6f 6c   of the next col
16df0 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20  umns hits. */.  
16e00 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
16e10 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b   int iStart = 0;
16e20 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ..    if( pCtx->
16e30 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20  eState==2 ){.   
16e40 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
16e50 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
16e60 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69  rint32(pChunk, i
16e70 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
16e80 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  f( fts5IndexCols
16e90 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f  etTest(pCtx->pCo
16ea0 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20  lset, iCol) ){. 
16eb0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
16ec0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ate = 1;.       
16ed0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16ee0 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78  ppendVarint(pCtx
16ef0 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20 20  ->pBuf, 1);.    
16f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16f10 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
16f20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
16f30 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ..    do {.     
16f40 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b   while( i<nChunk
16f50 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30   && pChunk[i]!=0
16f60 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 77  x01 ){.        w
16f70 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20  hile( pChunk[i] 
16f80 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  & 0x80 ) i++;.  
16f90 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
16fa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 74   }.      if( pCt
16fb0 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  x->eState ){.   
16fc0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
16fd0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
16fe0 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
16ff0 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
17000 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  art);.      }.  
17010 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b      if( i<nChunk
17020 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
17030 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 53  iCol;.        iS
17040 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  tart = i;.      
17050 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69    i++;.        i
17060 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a  f( i>=nChunk ){.
17070 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
17080 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
17090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
170a0 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
170b0 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c  Varint32(pChunk,
170c0 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20   i, iCol);.     
170d0 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74       pCtx->eStat
170e0 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  e = fts5IndexCol
170f0 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
17100 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  olset, iCol);.  
17110 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
17120 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
17130 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
17140 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
17150 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43  (pCtx->pBuf, &pC
17160 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d  hunk[iStart], i-
17170 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
17180 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b       iStart = i;
17190 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
171a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
171b0 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68     }while( i<nCh
171c0 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  unk );.  }.}..st
171d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
171e0 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46 74  unkIterate(.  Ft
171f0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17210 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
17220 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
17230 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  pSeg,           
17240 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66     /* Poslist of
17250 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a   this iterator *
17260 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  /.  void *pCtx, 
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70      /* Context p
17290 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75 6e  ointer for xChun
172a0 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
172b0 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28 46  void (*xChunk)(F
172c0 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a  ts5Index*, void*
172d0 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74  , const u8*, int
172e0 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20  ).){.  int nRem 
172f0 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20  = pSeg->nPos;   
17300 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17310 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c 20   of bytes still 
17320 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73  to come */.  Fts
17330 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 30  5Data *pData = 0
17340 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d  ;.  u8 *pChunk =
17350 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70   &pSeg->pLeaf->p
17360 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
17370 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e  et];.  int nChun
17380 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53  k = MIN(nRem, pS
17390 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
173a0 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  f - pSeg->iLeafO
173b0 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70 67  ffset);.  int pg
173c0 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66  no = pSeg->iLeaf
173d0 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f  Pgno;.  int pgno
173e0 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Save = 0;..  /* 
173f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
17400 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69 74 68  es notmwork with
17410 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64 61 74   detail=none dat
17420 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61 73 73  abases. */.  ass
17430 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ert( p->pConfig-
17440 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
17450 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  ETAIL_NONE );.. 
17460 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61 67   if( (pSeg->flag
17470 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
17480 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a  _REVERSE)==0 ){.
17490 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20 70      pgnoSave = p
174a0 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  gno+1;.  }..  wh
174b0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78 43  ile( 1 ){.    xC
174c0 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70 43  hunk(p, pCtx, pC
174d0 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20  hunk, nChunk);. 
174e0 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e     nRem -= nChun
174f0 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  k;.    fts5DataR
17500 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
17510 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29     if( nRem<=0 )
17520 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
17530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17540 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44  pgno++;.      pD
17550 61 74 61 20 3d 20 66 74 73 35 4c 65 61 66 52 65  ata = fts5LeafRe
17560 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
17570 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70  NT_ROWID(pSeg->p
17580 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e  Seg->iSegid, pgn
17590 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
175a0 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Data==0 ) break;
175b0 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20  .      pChunk = 
175c0 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20  &pData->p[4];.  
175d0 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e      nChunk = MIN
175e0 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a  (nRem, pData->sz
175f0 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20 20 20  Leaf - 4);.     
17600 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53   if( pgno==pgnoS
17610 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ave ){.        a
17620 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e 65  ssert( pSeg->pNe
17630 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
17640 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74       pSeg->pNext
17650 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20  Leaf = pData;.  
17660 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b        pData = 0;
17670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17680 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
17690 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
176a0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
176b0 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f   valid entry (no
176c0 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20  t EOF). This.** 
176d0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
176e0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
176f0 73 74 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  st data for the 
17700 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74 6f  current entry to
17710 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e  .** buffer pBuf.
17720 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b   It does not mak
17730 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
17740 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
17750 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a  ze.** field..*/.
17760 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17770 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 0a  SegiterPoslist(.
17780 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
17790 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
177a0 53 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65  Seg,.  Fts5Colse
177b0 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74  t *pColset,.  Ft
177c0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
177d0 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42  {.  if( 0==fts5B
177e0 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
177f0 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50  , pBuf, pSeg->nP
17800 6f 73 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  os) ){.    if( p
17810 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Colset==0 ){.   
17820 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
17830 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f  ate(p, pSeg, (vo
17840 69 64 2a 29 70 42 75 66 2c 20 66 74 73 35 50 6f  id*)pBuf, fts5Po
17850 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a  slistCallback);.
17860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17870 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
17880 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
17890 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20  ETAIL_FULL ){.  
178a0 20 20 20 20 20 20 50 6f 73 6c 69 73 74 43 61 6c        PoslistCal
178b0 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b 0a 20  lbackCtx sCtx;. 
178c0 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66         sCtx.pBuf
178d0 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20   = pBuf;.       
178e0 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
178f0 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20  pColset;.       
17900 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d 20 66   sCtx.eState = f
17910 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
17920 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a  st(pColset, 0);.
17930 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17940 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c  sCtx.eState==0 |
17950 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31  | sCtx.eState==1
17960 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35   );.        fts5
17970 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
17980 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43  pSeg, (void*)&sC
17990 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 46  tx, fts5PoslistF
179a0 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a  ilterCallback);.
179b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
179c0 20 20 20 20 20 50 6f 73 6c 69 73 74 4f 66 66 73       PoslistOffs
179d0 65 74 73 43 74 78 20 73 43 74 78 3b 0a 20 20 20  etsCtx sCtx;.   
179e0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74       memset(&sCt
179f0 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74  x, 0, sizeof(sCt
17a00 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73 43 74  x));.        sCt
17a10 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20  x.pBuf = pBuf;. 
17a20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c         sCtx.pCol
17a30 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
17a40 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b         fts5Chunk
17a50 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c  Iterate(p, pSeg,
17a60 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66   (void*)&sCtx, f
17a70 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ts5PoslistOffset
17a80 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  sCallback);.    
17a90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
17aa0 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61  ./*.** IN/OUT pa
17ab0 72 61 6d 65 74 65 72 20 28 2a 70 61 29 20 70 6f  rameter (*pa) po
17ac0 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69 74 69  ints to a positi
17ad0 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74 65 73 20  on list n bytes 
17ae0 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74  in size. If.** t
17af0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
17b00 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
17b10 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  s for column iCo
17b20 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29 20 69 73  l, then (*pa) is
17b30 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74   set.** to point
17b40 20 74 6f 20 74 68 65 20 73 75 62 2d 70 6f 73 69   to the sub-posi
17b50 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68  tion-list for th
17b60 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68  at column and th
17b70 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62  e number of.** b
17b80 79 74 65 73 20 69 6e 20 69 74 20 72 65 74 75 72  ytes in it retur
17b90 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
17ba0 61 72 67 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f  argument positio
17bb0 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a  n list does not.
17bc0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65  ** contain any e
17bd0 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d  ntries for colum
17be0 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30  n iCol, return 0
17bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17c00 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
17c10 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  Col(.  const u8 
17c20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20 20 20 20  **pa,           
17c30 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
17c40 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73  : Pointer to pos
17c50 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  list */.  int n,
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a            /* IN:
17c80 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74   Size of poslist
17c90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
17ca0 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20  nt iCol         
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17cc0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  * Column to extr
17cd0 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74  act from poslist
17ce0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75   */.){.  int iCu
17cf0 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  rrent = 0;      
17d00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 74           /* Anyt
17d10 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68 65 20  hing before the 
17d20 66 69 72 73 74 20 30 78 30 31 20 69 73 20 63 6f  first 0x01 is co
17d30 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  l 0 */.  const u
17d40 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f  8 *p = *pa;.  co
17d50 6e 73 74 20 75 38 20 2a 70 45 6e 64 20 3d 20 26  nst u8 *pEnd = &
17d60 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  p[n];         /*
17d70 20 4f 6e 65 20 62 79 74 65 20 70 61 73 74 20 65   One byte past e
17d80 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c  nd of position l
17d90 69 73 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  ist */..  while(
17da0 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29   iCol>iCurrent )
17db0 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  {.    /* Advance
17dc0 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c   pointer p until
17dd0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45   it points to pE
17de0 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79  nd or an 0x01 by
17df0 74 65 20 74 68 61 74 20 69 73 0a 20 20 20 20 2a  te that is.    *
17e00 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  * not part of a 
17e10 76 61 72 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61  varint. Note tha
17e20 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  t it is not poss
17e30 69 62 6c 65 20 66 6f 72 20 61 20 6e 65 67 61 74  ible for a negat
17e40 69 76 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78  ive.    ** or ex
17e50 74 72 65 6d 65 6c 79 20 6c 61 72 67 65 20 76 61  tremely large va
17e60 72 69 6e 74 20 74 6f 20 6f 63 63 75 72 20 77 69  rint to occur wi
17e70 74 68 69 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70  thin an uncorrup
17e80 74 65 64 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20  ted position .  
17e90 20 20 2a 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68    ** list. So th
17ea0 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65  e last byte of e
17eb0 61 63 68 20 76 61 72 69 6e 74 20 6d 61 79 20 62  ach varint may b
17ec0 65 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  e assumed to hav
17ed0 65 20 61 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a  e a clear.    **
17ee0 20 30 78 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20   0x80 bit.  */. 
17ef0 20 20 20 77 68 69 6c 65 28 20 2a 70 21 3d 30 78     while( *p!=0x
17f00 30 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  01 ){.      whil
17f10 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29  e( *p++ & 0x80 )
17f20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3e 3d 70  ;.      if( p>=p
17f30 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  End ) return 0;.
17f40 20 20 20 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20      }.    *pa = 
17f50 70 2b 2b 3b 0a 20 20 20 20 69 43 75 72 72 65 6e  p++;.    iCurren
17f60 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66  t = *p++;.    if
17f70 28 20 69 43 75 72 72 65 6e 74 20 26 20 30 78 38  ( iCurrent & 0x8
17f80 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a  0 ){.      p--;.
17f90 20 20 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47        p += fts5G
17fa0 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 69 43  etVarint32(p, iC
17fb0 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  urrent);.    }. 
17fc0 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d 69   }.  if( iCol!=i
17fd0 43 75 72 72 65 6e 74 20 29 20 72 65 74 75 72 6e  Current ) return
17fe0 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   0;..  /* Advanc
17ff0 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69  e pointer p unti
18000 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  l it points to p
18010 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62  End or an 0x01 b
18020 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  yte that is.  **
18030 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76   not part of a v
18040 61 72 69 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65  arint */.  while
18050 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d  ( p<pEnd && *p!=
18060 30 78 30 31 20 29 7b 0a 20 20 20 20 77 68 69 6c  0x01 ){.    whil
18070 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29  e( *p++ & 0x80 )
18080 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
18090 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74  p - (*pa);.}..st
180a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
180b0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74  dexExtractColset
180c0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20  (.  int *pRc,.  
180d0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
180e0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
180f0 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c  /* Colset to fil
18100 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ter on */.  cons
18110 74 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20  t u8 *pPos, int 
18120 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50  nPos,       /* P
18130 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
18140 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
18150 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
18160 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
18170 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a  er */.){.  if( *
18180 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
18190 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
181a0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
181b0 70 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69  pBuf);.    for(i
181c0 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e  =0; i<pColset->n
181d0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
181e0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 75 62 20   const u8 *pSub 
181f0 3d 20 70 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e  = pPos;.      in
18200 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49 6e 64  t nSub = fts5Ind
18210 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70 53  exExtractCol(&pS
18220 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65  ub, nPos, pColse
18230 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20  t->aiCol[i]);.  
18240 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a      if( nSub ){.
18250 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
18260 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63  erAppendBlob(pRc
18270 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53  , pBuf, nSub, pS
18280 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
18290 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
182a0 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c  xSetOutputs call
182b0 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74  back used by det
182c0 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e  ail=none tables.
182d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
182e0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
182f0 74 73 5f 4e 6f 6e 65 28 46 74 73 35 49 74 65 72  ts_None(Fts5Iter
18300 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
18310 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 61  Iter *pSeg){.  a
18320 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
18330 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  ndex->pConfig->e
18340 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
18350 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49  AIL_NONE );.  pI
18360 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
18370 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
18380 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e  .  pIter->base.n
18390 44 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  Data = pSeg->nPo
183a0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74  s;.}../*.** xSet
183b0 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
183c0 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
183d0 66 75 6c 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d  full and detail=
183e0 63 6f 6c 20 74 61 62 6c 65 73 20 77 68 65 6e 20  col tables when 
183f0 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c  no.** column fil
18400 74 65 72 73 20 61 72 65 20 73 70 65 63 69 66 69  ters are specifi
18410 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
18420 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18430 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46  tputs_Nocolset(F
18440 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
18450 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
18460 67 29 7b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  g){.  pIter->bas
18470 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
18480 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72  >iRowid;.  pIter
18490 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70  ->base.nData = p
184a0 53 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73  Seg->nPos;..  as
184b0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
184c0 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  dex->pConfig->eD
184d0 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
184e0 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  IL_NONE );.  ass
184f0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c  ert( pIter->pCol
18500 73 65 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  set==0 );..  if(
18510 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
18520 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70  et+pSeg->nPos<=p
18530 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  Seg->pLeaf->szLe
18540 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  af ){.    /* All
18550 20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20   data is stored 
18560 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
18570 61 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  age. Populate th
18580 65 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a  e output .    **
18590 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f   variables to po
185a0 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  int into the bod
185b0 79 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62  y of the page ob
185c0 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74  ject. */.    pIt
185d0 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
185e0 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70   &pSeg->pLeaf->p
185f0 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
18600 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et];.  }else{.  
18610 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73    /* The data is
18620 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65   distributed ove
18630 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61  r two or more pa
18640 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74  ges. Copy it int
18650 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73  o the.    ** Fts
18660 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75  5Iter.poslist bu
18670 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65  ffer and then se
18680 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69  t the output poi
18690 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20  nter to point.  
186a0 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66    ** to this buf
186b0 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73  fer.  */.    fts
186c0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
186d0 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
186e0 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73    fts5SegiterPos
186f0 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  list(pIter->pInd
18700 65 78 2c 20 70 53 65 67 2c 20 30 2c 20 26 70 49  ex, pSeg, 0, &pI
18710 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
18720 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70     pIter->base.p
18730 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
18740 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a  slist.p;.  }.}..
18750 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
18760 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
18770 77 68 65 6e 20 74 68 65 20 46 74 73 35 43 6f 6c  when the Fts5Col
18780 73 65 74 20 6f 62 6a 65 63 74 20 68 61 73 20 6e  set object has n
18790 43 6f 6c 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a  Col==0 (match.**
187a0 20 61 67 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75   against no colu
187b0 6d 6e 73 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a  mns at all)..*/.
187c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
187d0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 5a  IterSetOutputs_Z
187e0 65 72 6f 43 6f 6c 73 65 74 28 46 74 73 35 49 74  eroColset(Fts5It
187f0 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
18800 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
18810 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 53   UNUSED_PARAM(pS
18820 65 67 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  eg);.  pIter->ba
18830 73 65 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a  se.nData = 0;.}.
18840 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
18850 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
18860 20 62 79 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77   by detail=col w
18870 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
18880 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20  olumn filter.** 
18890 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 31 30  and there are 10
188a0 30 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  0 or more column
188b0 73 2e 20 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61  s. Also called a
188c0 73 20 61 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f  s a fallback fro
188d0 6d 0a 2a 2a 20 66 74 73 35 49 74 65 72 53 65 74  m.** fts5IterSet
188e0 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 20 69  Outputs_Col100 i
188f0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73  f the column-lis
18900 74 20 73 70 61 6e 73 20 6d 6f 72 65 20 74 68 61  t spans more tha
18910 6e 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n one page..*/.s
18920 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18930 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18940 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  l(Fts5Iter *pIte
18950 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
18960 70 53 65 67 29 7b 0a 20 20 66 74 73 35 42 75 66  pSeg){.  fts5Buf
18970 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
18980 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35  poslist);.  fts5
18990 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
189a0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53  Iter->pIndex, pS
189b0 65 67 2c 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  eg, pIter->pCols
189c0 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  et, &pIter->posl
189d0 69 73 74 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62  ist);.  pIter->b
189e0 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
189f0 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74  g->iRowid;.  pIt
18a00 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
18a10 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18a20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  p;.  pIter->base
18a30 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .nData = pIter->
18a40 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a  poslist.n;.}../*
18a50 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
18a60 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68  callback used wh
18a70 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64  en: .**.**   * d
18a80 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20  etail=col,.**   
18a90 2a 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c  * there is a col
18aa0 75 6d 6e 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a  umn filter, and.
18ab0 2a 2a 20 20 20 2a 20 74 68 65 20 74 61 62 6c 65  **   * the table
18ac0 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20 6f 72   contains 100 or
18ad0 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20   fewer columns. 
18ae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  .**.** The last 
18af0 70 6f 69 6e 74 20 69 73 20 74 6f 20 65 6e 73 75  point is to ensu
18b00 72 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75  re all column nu
18b10 6d 62 65 72 73 20 61 72 65 20 73 74 6f 72 65 64  mbers are stored
18b20 20 61 73 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62   as .** single-b
18b30 79 74 65 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a  yte varints..*/.
18b40 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18b50 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43  IterSetOutputs_C
18b60 6f 6c 31 30 30 28 46 74 73 35 49 74 65 72 20 2a  ol100(Fts5Iter *
18b70 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
18b80 65 72 20 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73  er *pSeg){..  as
18b90 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
18ba0 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  dex->pConfig->eD
18bb0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
18bc0 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20  IL_COLUMNS );.  
18bd0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18be0 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28  Colset );..  if(
18bf0 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
18c00 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53  et+pSeg->nPos>pS
18c10 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
18c20 66 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65  f ){.    fts5Ite
18c30 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28  rSetOutputs_Col(
18c40 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20  pIter, pSeg);.  
18c50 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61  }else{.    u8 *a
18c60 20 3d 20 28 75 38 2a 29 26 70 53 65 67 2d 3e 70   = (u8*)&pSeg->p
18c70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
18c80 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
18c90 75 38 20 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29  u8 *pEnd = (u8*)
18ca0 26 61 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20  &a[pSeg->nPos]; 
18cb0 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76 20 3d  .    int iPrev =
18cc0 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43   0;.    int *aiC
18cd0 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c  ol = pIter->pCol
18ce0 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20  set->aiCol;.    
18cf0 69 6e 74 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20  int *aiColEnd = 
18d00 26 61 69 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43  &aiCol[pIter->pC
18d10 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20  olset->nCol];.. 
18d20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 70 49     u8 *aOut = pI
18d30 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18d40 20 20 20 20 69 6e 74 20 69 50 72 65 76 4f 75 74      int iPrevOut
18d50 20 3d 20 30 3b 0a 0a 20 20 20 20 70 49 74 65 72   = 0;..    pIter
18d60 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18d70 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20  pSeg->iRowid;.. 
18d80 20 20 20 77 68 69 6c 65 28 20 61 3c 70 45 6e 64     while( a<pEnd
18d90 20 29 7b 0a 20 20 20 20 20 20 69 50 72 65 76 20   ){.      iPrev 
18da0 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d  += (int)a++[0] -
18db0 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   2;.      while(
18dc0 20 2a 61 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b   *aiCol<iPrev ){
18dd0 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b  .        aiCol++
18de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 69  ;.        if( ai
18df0 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20  Col==aiColEnd ) 
18e00 67 6f 74 6f 20 73 65 74 6f 75 74 70 75 74 73 5f  goto setoutputs_
18e10 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  col_out;.      }
18e20 0a 20 20 20 20 20 20 69 66 28 20 2a 61 69 43 6f  .      if( *aiCo
18e30 6c 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20  l==iPrev ){.    
18e40 20 20 20 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75      *aOut++ = (u
18e50 38 29 28 28 69 50 72 65 76 20 2d 20 69 50 72 65  8)((iPrev - iPre
18e60 76 4f 75 74 29 20 2b 20 32 29 3b 0a 20 20 20 20  vOut) + 2);.    
18e70 20 20 20 20 69 50 72 65 76 4f 75 74 20 3d 20 69      iPrevOut = i
18e80 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
18e90 20 20 7d 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f    }..setoutputs_
18ea0 63 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74  col_out:.    pIt
18eb0 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
18ec0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18ed0 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  p;.    pIter->ba
18ee0 73 65 2e 6e 44 61 74 61 20 3d 20 61 4f 75 74 20  se.nData = aOut 
18ef0 2d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  - pIter->poslist
18f00 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  .p;.  }.}../*.**
18f10 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
18f20 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65  lback used by de
18f30 74 61 69 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74  tail=full when t
18f40 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
18f50 20 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   filter..*/.stat
18f60 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18f70 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28  SetOutputs_Full(
18f80 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
18f90 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
18fa0 65 67 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65  eg){.  Fts5Colse
18fb0 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20 70 49 74  t *pColset = pIt
18fc0 65 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70  er->pColset;.  p
18fd0 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69  Iter->base.iRowi
18fe0 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64  d = pSeg->iRowid
18ff0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
19000 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e  er->pIndex->pCon
19010 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
19020 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29  S5_DETAIL_FULL )
19030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
19040 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  set );..  if( pS
19050 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
19060 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67  pSeg->nPos<=pSeg
19070 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
19080 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61  ){.    /* All da
19090 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20  ta is stored on 
190a0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
190b0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
190c0 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61  utput .    ** va
190d0 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74  riables to point
190e0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
190f0 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  f the page objec
19100 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  t. */.    const 
19110 75 38 20 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70  u8 *a = &pSeg->p
19120 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
19130 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
19140 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  if( pColset->nCo
19150 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49  l==1 ){.      pI
19160 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
19170 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  = fts5IndexExtra
19180 63 74 43 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e  ctCol(&a, pSeg->
19190 6e 50 6f 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69  nPos,pColset->ai
191a0 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70  Col[0]);.      p
191b0 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
191c0 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = a;.    }else{
191d0 0a 20 20 20 20 20 20 69 6e 74 20 2a 70 52 63 20  .      int *pRc 
191e0 3d 20 26 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  = &pIter->pIndex
191f0 2d 3e 72 63 3b 0a 20 20 20 20 20 20 66 74 73 35  ->rc;.      fts5
19200 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
19210 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
19220 20 20 20 66 74 73 35 49 6e 64 65 78 45 78 74 72     fts5IndexExtr
19230 61 63 74 43 6f 6c 73 65 74 28 70 52 63 2c 20 70  actColset(pRc, p
19240 43 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65 67 2d  Colset, a, pSeg-
19250 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70  >nPos, &pIter->p
19260 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  oslist);.      p
19270 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
19280 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
19290 74 2e 70 3b 0a 20 20 20 20 20 20 70 49 74 65 72  t.p;.      pIter
192a0 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70  ->base.nData = p
192b0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  Iter->poslist.n;
192c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
192d0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
192e0 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f  is distributed o
192f0 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ver two or more 
19300 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69  pages. Copy it i
19310 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46  nto the.    ** F
19320 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20  ts5Iter.poslist 
19330 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20  buffer and then 
19340 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
19350 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a  ointer to point.
19360 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62      ** to this b
19370 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66  uffer.  */.    f
19380 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
19390 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
193a0 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
193b0 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49  oslist(pIter->pI
193c0 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c  ndex, pSeg, pCol
193d0 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  set, &pIter->pos
193e0 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72  list);.    pIter
193f0 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
19400 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
19410 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
19420 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .nData = pIter->
19430 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d  poslist.n;.  }.}
19440 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
19450 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43  s5IterSetOutputC
19460 62 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  b(int *pRc, Fts5
19470 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
19480 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
19490 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43  _OK ){.    Fts5C
194a0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
194b0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
194c0 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 66 28  pConfig;.    if(
194d0 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69   pConfig->eDetai
194e0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
194f0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ONE ){.      pIt
19500 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
19510 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
19520 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d  puts_None;.    }
19530 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  ..    else if( p
19540 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30  Iter->pColset==0
19550 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
19560 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
19570 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19580 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20  s_Nocolset;.    
19590 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  }..    else if( 
195a0 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e  pIter->pColset->
195b0 6e 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nCol==0 ){.     
195c0 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
195d0 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
195e0 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c  tOutputs_ZeroCol
195f0 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  set;.    }..    
19600 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 66 69 67  else if( pConfig
19610 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
19620 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20  DETAIL_FULL ){. 
19630 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
19640 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
19650 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c  erSetOutputs_Ful
19660 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c  l;.    }..    el
19670 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
19680 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ( pConfig->eDeta
19690 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
196a0 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20  COLUMNS );.     
196b0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43   if( pConfig->nC
196c0 6f 6c 3c 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ol<=100 ){.     
196d0 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
196e0 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
196f0 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30  SetOutputs_Col10
19700 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
19710 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
19720 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f  (pRc, &pIter->po
19730 73 6c 69 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e  slist, pConfig->
19740 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nCol);.      }el
19750 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  se{.        pIte
19760 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19770 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19780 75 74 73 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d  uts_Col;.      }
19790 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
197a0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
197b0 6e 65 77 20 46 74 73 35 49 74 65 72 20 6f 62 6a  new Fts5Iter obj
197c0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ect..**.** The n
197d0 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  ew object will b
197e0 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
197f0 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69  e through data i
19800 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  n structure pStr
19810 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65  uct..** If iLeve
19820 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61  l is -ve, then a
19830 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73  ll data in all s
19840 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65  egments is merge
19850 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c  d. Or, if iLevel
19860 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67  .** is zero or g
19870 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f  reater, data fro
19880 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67  m the first nSeg
19890 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  ment segments on
198a0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a   level iLevel.**
198b0 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a   is merged..**.*
198c0 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  * The iterator i
198d0 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20  nitially points 
198e0 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  to the first ter
198f0 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e  m/rowid entry in
19900 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65   the .** iterate
19910 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
19920 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
19930 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49  IterNew(.  Fts5I
19940 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
19950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
19960 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
19970 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
19980 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
19990 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  *pStruct,       
199a0 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
199b0 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78  f specific index
199c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44        /* FTS5IND
199f0 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61  EX_QUERY_XXX fla
19a00 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  gs */.  Fts5Cols
19a10 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
19a20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65          /* Colse
19a30 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28  t to filter on (
19a40 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f  or NULL) */.  co
19a50 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
19a60 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
19a70 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
19a80 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a   (or NULL/0) */.
19a90 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ab0 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74    /* Level to it
19ac0 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c  erate (-1 for al
19ad0 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  l) */.  int nSeg
19ae0 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ment,           
19af0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19b00 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f  r of segments to
19b10 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d   merge (iLevel>=
19b20 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72  0) */.  Fts5Iter
19b30 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
19b40 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
19b50 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
19b60 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20  t nSeg = 0;     
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b80 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
19b90 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20  nt-iters in use 
19ba0 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d  */.  int iIter =
19bb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19bc0 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74       /* */.  int
19bd0 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19bf0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
19c00 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73  through segments
19c10 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
19c20 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a  ureLevel *pLvl;.
19c30 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77    Fts5Iter *pNew
19c40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ;..  assert( (pT
19c50 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d  erm==0 && nTerm=
19c60 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20  =0) || iLevel<0 
19c70 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
19c80 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
19c90 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74  new multi-seg-it
19ca0 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28  erator. */.  if(
19cb0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19cc0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
19cd0 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  vel<0 ){.      a
19ce0 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
19cf0 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
19d00 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
19d10 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
19d20 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53  .      nSeg = pS
19d30 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
19d40 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28  .      nSeg += (
19d50 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30  p->pHash ? 1 : 0
19d60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19d70 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70      nSeg = MIN(p
19d80 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
19d90 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65  Level].nSeg, nSe
19da0 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  gment);.    }.  
19db0 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65  }.  *ppOut = pNe
19dc0 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
19dd0 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b  rAlloc(p, nSeg);
19de0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
19df0 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
19e00 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
19e10 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
19e20 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
19e30 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
19e40 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46  = (0!=(flags & F
19e50 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
19e60 4b 49 50 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e  KIPEMPTY));.  pN
19e70 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20 70 53  ew->pStruct = pS
19e80 74 72 75 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  truct;.  pNew->p
19e90 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74  Colset = pColset
19ea0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
19eb0 65 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a 20  eRef(pStruct);. 
19ec0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 46 54   if( (flags & FT
19ed0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
19ee0 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20  OUTPUT)==0 ){.  
19ef0 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
19f00 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e  putCb(&p->rc, pN
19f10 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ew);.  }..  /* I
19f20 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
19f30 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
19f40 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
19f50 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  s. */.  if( p->r
19f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19f70 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
19f80 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
19f90 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
19fa0 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
19fb0 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
19fc0 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66  Level];.      if
19fd0 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
19fe0 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73        /* Add a s
19ff0 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
1a000 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1a010 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a020 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  hash table. */. 
1a030 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a040 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
1a050 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
1a060 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1a070 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c  gIterHashInit(p,
1a080 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
1a090 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20  lags, pIter);.  
1a0a0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1a0b0 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
1a0c0 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
1a0d0 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
1a0e0 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70        for(iSeg=p
1a0f0 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65  Lvl->nSeg-1; iSe
1a100 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
1a110 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
1a120 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1a130 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
1a140 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
1a150 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1a160 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
1a170 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
1a180 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1a190 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
1a1a0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
1a1b0 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49 74  nit(p, pSeg, pIt
1a1c0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
1a1d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a1e0 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65    fts5SegIterSee
1a1f0 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  kInit(p, pTerm, 
1a200 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53  nTerm, flags, pS
1a210 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
1a220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
1a240 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20  lse{.      pLvl 
1a250 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a260 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  el[iLevel];.    
1a270 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d    for(iSeg=nSeg-
1a280 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67  1; iSeg>=0; iSeg
1a290 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  --){.        fts
1a2a0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
1a2b0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
1a2c0 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
1a2d0 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20  Iter++]);.      
1a2e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a2f0 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
1a300 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1a310 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73 75  the above was su
1a320 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63  ccessful, each c
1a330 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f  omponent iterato
1a340 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20  rs now points . 
1a350 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74   ** to the first
1a360 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65   entry in its se
1a370 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63  gment. In this c
1a380 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  ase initialize t
1a390 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b  he .  ** aFirst[
1a3a0 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  ] array. Or, if 
1a3b0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1a3c0 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65 20  urred, free the 
1a3d0 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62  iterator.  ** ob
1a3e0 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68 65  ject and set the
1a3f0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1a400 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20   to NULL.  */.  
1a410 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28  E_OK ){.    for(
1a430 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67  iIter=pNew->nSeg
1a440 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
1a450 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
1a460 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
1a470 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
1a480 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
1a490 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
1a4a0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a4b0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77  er *pSeg = &pNew
1a4c0 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20  ->aSeg[iEq];.   
1a4d0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a4e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 53 65 67  SQLITE_OK ) pSeg
1a4f0 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
1a500 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
1a510 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
1a520 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
1a530 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
1a540 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
1a550 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
1a560 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
1a570 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
1a580 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
1a590 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
1a5a0 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
1a5b0 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
1a5c0 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
1a5d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
1a5e0 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
1a5f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1a600 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66   pNew->base.bEof
1a610 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  ==0 ){.      Fts
1a620 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1a630 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65   &pNew->aSeg[pNe
1a640 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1a650 72 73 74 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  rst];.      pNew
1a660 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 4e  ->xSetOutputs(pN
1a670 65 77 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d  ew, pSeg);.    }
1a680 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ..  }else{.    f
1a690 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1a6a0 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f  (pNew);.    *ppO
1a6b0 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ut = 0;.  }.}../
1a6c0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46  *.** Create an F
1a6d0 74 73 35 49 74 65 72 20 74 68 61 74 20 69 74 65  ts5Iter that ite
1a6e0 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
1a6f0 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76 69 64  e doclist provid
1a700 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
1a710 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1a720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a730 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 0a  5MultiIterNew2(.
1a740 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1a770 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
1a780 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  hin */.  Fts5Dat
1a790 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  a *pData,       
1a7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
1a7b0 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ist to iterate t
1a7c0 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
1a7d0 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a7f0 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69  rue for descendi
1a800 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a  ng rowid order *
1a810 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70  /.  Fts5Iter **p
1a820 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  pOut            
1a830 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
1a840 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74  t */.){.  Fts5It
1a850 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  er *pNew;.  pNew
1a860 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a870 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69  Alloc(p, 2);.  i
1a880 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46  f( pNew ){.    F
1a890 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
1a8a0 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
1a8b0 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  1];..    pIter->
1a8c0 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45 47  flags = FTS5_SEG
1a8d0 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
1a8e0 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c    if( pData->szL
1a8f0 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  eaf>0 ){.      p
1a900 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44  Iter->pLeaf = pD
1a910 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ata;.      pIter
1a920 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
1a930 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44  fts5GetVarint(pD
1a940 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  ata->p, (u64*)&p
1a950 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
1a960 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
1a970 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61 74  ofDoclist = pDat
1a980 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65  a->nn;.      pNe
1a990 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1a9a0 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  rst = 1;.      i
1a9b0 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
1a9c0 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d      pNew->bRev =
1a9d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   1;.        pIte
1a9e0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
1a9f0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
1aa00 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1aa10 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
1aa20 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
1aa30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1aa40 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1aa50 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
1aa60 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1aa70 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
1aa80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1aa90 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  ew->base.bEof = 
1aaa0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  1;.    }.    fts
1aab0 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
1aac0 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
1aad0 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
1aae0 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
1aaf0 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
1ab00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1ab10 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
1ab20 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
1ab30 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
1ab40 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
1ab50 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
1ab60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1ab70 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
1ab80 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1ab90 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1aba0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20  assert( p->rc . 
1abb0 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
1abc0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1abd0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
1abe0 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
1abf0 2d 3e 62 61 73 65 2e 62 45 6f 66 20 0a 20 20 29  ->base.bEof .  )
1ac00 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
1ac10 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 61 73 65  c || pIter->base
1ac20 2e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .bEof);.}../*.**
1ac30 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
1ac40 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
1ac50 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
1ac60 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1ac70 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
1ac80 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
1ac90 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
1aca0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1acb0 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
1acc0 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
1acd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1ace0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1acf0 69 64 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  id(Fts5Iter *pIt
1ad00 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1ad10 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1ad20 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1ad30 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
1ad40 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
1ad50 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1ad60 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
1ad70 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1ad80 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
1ad90 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1ada0 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
1adb0 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
1adc0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1add0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
1ade0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1adf0 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
1ae00 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61  Iter, .  i64 iMa
1ae10 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20  tch.){.  while( 
1ae20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  1 ){.    i64 iRo
1ae30 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  wid;.    fts5Mul
1ae40 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1ae50 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b  ter, 1, iMatch);
1ae60 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c  .    if( fts5Mul
1ae70 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
1ae80 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  er) ) break;.   
1ae90 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
1aea0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1aeb0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
1aec0 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69  er->bRev==0 && i
1aed0 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
1aee0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
1aef0 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26  Iter->bRev!=0 &&
1af00 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
1af10 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
1af20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1af30 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
1af40 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
1af50 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65  e term associate
1af60 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65  d with the .** e
1af70 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
1af80 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
1af90 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
1afa0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a  tatic const u8 *
1afb0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
1afc0 6d 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  m(Fts5Iter *pIte
1afd0 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
1afe0 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
1aff0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
1b000 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1b010 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
1b020 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
1b030 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
1b040 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1b050 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1b060 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
1b070 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
1b080 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
1b090 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
1b0a0 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
1b0b0 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
1b0c0 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
1b0d0 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
1b0e0 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
1b0f0 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
1b100 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
1b110 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
1b120 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
1b130 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1b140 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
1b150 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1b160 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b170 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
1b180 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
1b190 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1b1a0 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
1b1b0 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
1b1c0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
1b1d0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
1b1e0 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
1b1f0 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
1b200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b210 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1b220 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
1b230 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1b240 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1b250 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
1b260 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 54 53  se{.      /* FTS
1b270 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 69 73  5_MAX_SEGMENT is
1b280 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
1b290 65 64 20 61 73 20 32 30 30 30 2e 20 53 6f 20 74  ed as 2000. So t
1b2a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
1b2b0 20 20 20 2a 2a 20 61 72 72 61 79 20 69 73 20 36     ** array is 6
1b2c0 33 20 65 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 32  3 elements, or 2
1b2d0 35 32 20 62 79 74 65 73 2c 20 69 6e 20 73 69 7a  52 bytes, in siz
1b2e0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  e.  */.      u32
1b2f0 20 61 55 73 65 64 5b 28 46 54 53 35 5f 4d 41 58   aUsed[(FTS5_MAX
1b300 5f 53 45 47 4d 45 4e 54 2b 33 31 29 20 2f 20 33  _SEGMENT+31) / 3
1b310 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  2];.      int iL
1b320 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
1b330 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 33 32  int i;.      u32
1b340 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 6d 65 6d   mask;.      mem
1b350 73 65 74 28 61 55 73 65 64 2c 20 30 2c 20 73 69  set(aUsed, 0, si
1b360 7a 65 6f 66 28 61 55 73 65 64 29 29 3b 0a 20 20  zeof(aUsed));.  
1b370 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1b380 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1b390 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1b3a0 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
1b3b0 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
1b3c0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1b3d0 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1b3e0 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d         int iId =
1b3f0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1b400 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1b410 5d 2e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ].iSegid;.      
1b420 20 20 20 20 69 66 28 20 69 49 64 3c 3d 46 54 53      if( iId<=FTS
1b430 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b  5_MAX_SEGMENT ){
1b440 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 55 73  .            aUs
1b450 65 64 5b 28 69 49 64 2d 31 29 20 2f 20 33 32 5d  ed[(iId-1) / 32]
1b460 20 7c 3d 20 31 20 3c 3c 20 28 28 69 49 64 2d 31   |= 1 << ((iId-1
1b470 29 20 25 20 33 32 29 3b 0a 20 20 20 20 20 20 20  ) % 32);.       
1b480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1b490 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
1b4a0 72 28 69 3d 30 3b 20 61 55 73 65 64 5b 69 5d 3d  r(i=0; aUsed[i]=
1b4b0 3d 30 78 46 46 46 46 46 46 46 46 3b 20 69 2b 2b  =0xFFFFFFFF; i++
1b4c0 29 3b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20  );.      mask = 
1b4d0 61 55 73 65 64 5b 69 5d 3b 0a 20 20 20 20 20 20  aUsed[i];.      
1b4e0 66 6f 72 28 69 53 65 67 69 64 3d 30 3b 20 6d 61  for(iSegid=0; ma
1b4f0 73 6b 20 26 20 28 31 20 3c 3c 20 69 53 65 67 69  sk & (1 << iSegi
1b500 64 29 3b 20 69 53 65 67 69 64 2b 2b 29 3b 0a 20  d); iSegid++);. 
1b510 20 20 20 20 20 69 53 65 67 69 64 20 2b 3d 20 31       iSegid += 1
1b520 20 2b 20 69 2a 33 32 3b 0a 0a 23 69 66 64 65 66   + i*32;..#ifdef
1b530 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1b540 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1b550 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1b560 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1b570 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
1b580 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
1b590 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1b5a0 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1b5b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1b5c0 53 65 67 69 64 21 3d 70 53 74 72 75 63 74 2d 3e  Segid!=pStruct->
1b5d0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
1b5e0 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29  g[iSeg].iSegid )
1b5f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b600 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1b610 28 20 69 53 65 67 69 64 3e 30 20 26 26 20 69 53  ( iSegid>0 && iS
1b620 65 67 69 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53  egid<=FTS5_MAX_S
1b630 45 47 4d 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20  EGMENT );..     
1b640 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1b650 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c  e3_stmt *pIdxSel
1b660 65 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c  ect = fts5IdxSel
1b670 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 20 20  ectStmt(p);.    
1b680 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1b690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b6a0 20 20 20 20 20 20 75 38 20 61 42 6c 6f 62 5b 32        u8 aBlob[2
1b6b0 5d 20 3d 20 7b 30 78 66 66 2c 20 30 78 66 66 7d  ] = {0xff, 0xff}
1b6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b6d0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64  te3_bind_int(pId
1b6e0 78 53 65 6c 65 63 74 2c 20 31 2c 20 69 53 65 67  xSelect, 1, iSeg
1b6f0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  id);.          s
1b700 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1b710 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20  (pIdxSelect, 2, 
1b720 61 42 6c 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45  aBlob, 2, SQLITE
1b730 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1b740 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1b750 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65 6c  te3_step(pIdxSel
1b760 65 63 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ect)!=SQLITE_ROW
1b770 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
1b780 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1b790 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29 3b  set(pIdxSelect);
1b7a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1b7b0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64  e3_bind_null(pId
1b7c0 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20 20  xSelect, 2);.   
1b7d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1b7e0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1b7f0 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69 64  .  return iSegid
1b800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
1b810 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72  rd all data curr
1b820 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20  ently cached in 
1b830 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e  the hash-tables.
1b840 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b850 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
1b860 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a  Data(Fts5Index *
1b870 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
1b880 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65  >pHash || p->nPe
1b890 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
1b8a0 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29    if( p->pHash )
1b8b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1b8c0 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48  5HashClear(p->pH
1b8d0 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  ash);.    p->nPe
1b8e0 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1b8f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1b900 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1b910 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79  he prefix, in by
1b920 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72  tes, that buffer
1b930 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67   .** (pNew/<leng
1b940 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61  th-unknown>) sha
1b950 72 65 73 20 77 69 74 68 20 62 75 66 66 65 72 20  res with buffer 
1b960 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a  (pOld/nOld)..**.
1b970 2a 2a 20 42 75 66 66 65 72 20 28 70 4e 65 77 2f  ** Buffer (pNew/
1b980 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e  <length-unknown>
1b990 29 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  ) is guaranteed 
1b9a0 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 0a 2a  to be greater .*
1b9b0 2a 20 74 68 61 6e 20 62 75 66 66 65 72 20 28 70  * than buffer (p
1b9c0 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74  Old/nOld)..*/.st
1b9d0 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65  atic int fts5Pre
1b9e0 66 69 78 43 6f 6d 70 72 65 73 73 28 69 6e 74 20  fixCompress(int 
1b9f0 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
1ba00 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pOld, const u8 *
1ba10 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pNew){.  int i;.
1ba20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
1ba30 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1ba40 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69   pOld[i]!=pNew[i
1ba50 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ] ) break;.  }. 
1ba60 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74   return i;.}..st
1ba70 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1ba80 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20  iteDlidxClear(. 
1ba90 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1baa0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1bab0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1bac0 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20  bFlush          
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bae0 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c  f true, write dl
1baf0 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29  idx to disk */.)
1bb00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
1bb10 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c  ert( bFlush==0 |
1bb20 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
1bb30 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
1bb40 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
1bb50 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  >0) );.  for(i=0
1bb60 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c  ; i<pWriter->nDl
1bb70 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  idx; i++){.    F
1bb80 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1bb90 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1bba0 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
1bbb0 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
1bbc0 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  f.n==0 ) break;.
1bbd0 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29      if( bFlush )
1bbe0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bbf0 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20  pDlidx->pgno!=0 
1bc00 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
1bc10 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
1bc20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
1bc30 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1bc40 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
1bc50 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
1bc60 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
1bc70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
1bc80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1bc90 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1bca0 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1bcb0 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69  ->buf);.    pDli
1bcc0 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1bcd0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1bce0 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65   Grow the pWrite
1bcf0 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  r->aDlidx[] arra
1bd00 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c  y to at least nL
1bd10 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73  vl elements in s
1bd20 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20  ize..** Any new 
1bd30 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61  array elements a
1bd40 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  re zeroed before
1bd50 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1bd60 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
1bd70 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20  iteDlidxGrow(.  
1bd80 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1bd90 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1bda0 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c  Writer,.  int nL
1bdb0 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  vl.){.  if( p->r
1bdc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bdd0 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  nLvl>=pWriter->n
1bde0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
1bdf0 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
1be00 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
1be10 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33  xWriter*)sqlite3
1be20 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
1be30 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1be40 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  x, sizeof(Fts5Dl
1be50 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76  idxWriter) * nLv
1be60 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
1be70 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20   aDlidx==0 ){.  
1be80 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1be90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1bea0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1beb0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
1bec0 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
1bed0 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72   (nLvl - pWriter
1bee0 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  ->nDlidx);.     
1bef0 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b   memset(&aDlidx[
1bf00 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d  pWriter->nDlidx]
1bf10 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
1bf20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69     pWriter->aDli
1bf30 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20  dx = aDlidx;.   
1bf40 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69     pWriter->nDli
1bf50 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d  dx = nLvl;.    }
1bf60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
1bf70 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  >rc;.}../*.** If
1bf80 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
1bf90 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d  list-index accum
1bfa0 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74  ulating in pWrit
1bfb0 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20  er->aDlidx[] is 
1bfc0 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c  large.** enough,
1bfd0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
1bfe0 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  k and return 1. 
1bff0 4f 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72  Otherwise discar
1c000 64 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  d it and return.
1c010 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  ** zero..*/.stat
1c020 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
1c030 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49  FlushDlidx(Fts5I
1c040 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1c050 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1c060 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20  {.  int bFlag = 
1c070 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  0;..  /* If ther
1c080 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f  e were FTS5_MIN_
1c090 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f  DLIDX_SIZE or mo
1c0a0 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61  re empty leaf pa
1c0b0 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  ges written.  **
1c0c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c0d0 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  , also write the
1c0e0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74   doclist-index t
1c0f0 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66  o disk.  */.  if
1c100 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  ( pWriter->aDlid
1c110 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20  x[0].buf.n>0 && 
1c120 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
1c130 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
1c140 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61  SIZE ){.    bFla
1c150 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73  g = 1;.  }.  fts
1c160 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1c170 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c  (p, pWriter, bFl
1c180 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ag);.  pWriter->
1c190 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65  nEmpty = 0;.  re
1c1a0 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f  turn bFlag;.}../
1c1b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c1c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
1c1d0 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67  never processing
1c1e0 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
1c1f0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74  for the .** last
1c200 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61   term on leaf pa
1c210 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74  ge (pWriter->iBt
1c220 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74  Page) is complet
1c230 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ed. .**.** The d
1c240 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
1c250 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75   that term is cu
1c260 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1c270 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  n-memory within 
1c280 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  the.** Fts5SegWr
1c290 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72  iter.aDlidx[] ar
1c2a0 72 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61  ray. If it is la
1c2b0 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73  rge enough, this
1c2c0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69   function.** wri
1c2d0 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69  tes it out to di
1c2e0 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  sk. Or, if it is
1c2f0 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f   too small to bo
1c300 74 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61  ther with, disca
1c310 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a  rds.** it..**.**
1c320 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62   Fts5SegWriter.b
1c330 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20  tterm currently 
1c340 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
1c350 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
1c360 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  iBtPage..*/.stat
1c370 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1c380 65 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35  eFlushBtree(Fts5
1c390 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
1c3a0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1c3b0 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a  ){.  int bFlag;.
1c3c0 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1c3d0 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70  er->iBtPage || p
1c3e0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d  Writer->nEmpty==
1c3f0 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74  0 );.  if( pWrit
1c400 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29  er->iBtPage==0 )
1c410 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67   return;.  bFlag
1c420 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73   = fts5WriteFlus
1c430 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65  hDlidx(p, pWrite
1c440 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  r);..  if( p->rc
1c450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c460 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c470 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74   = (pWriter->btt
1c480 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63  erm.n>0?(const c
1c490 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74  har*)pWriter->bt
1c4a0 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20  term.p:"");.    
1c4b0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c4c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e   was already don
1c4d0 65 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e  e in fts5WriteIn
1c4e0 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20  it(): */.    /* 
1c4f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1c500 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1c510 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1c520 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  id); */.    sqli
1c530 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
1c540 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20  >pIdxWriter, 2, 
1c550 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65  z, pWriter->btte
1c560 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  rm.n, SQLITE_STA
1c570 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
1c580 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
1c590 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62  pIdxWriter, 3, b
1c5a0 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72  Flag + ((i64)pWr
1c5b0 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31  iter->iBtPage<<1
1c5c0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
1c5d0 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74  step(p->pIdxWrit
1c5e0 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
1c5f0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1c600 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
1c610 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c620 6e 75 6c 6c 28 70 2d 3e 70 49 64 78 57 72 69 74  null(p->pIdxWrit
1c630 65 72 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 70 57  er, 2);.  }.  pW
1c640 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
1c650 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1c660 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  s is called once
1c670 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70   for each leaf p
1c680 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66  age except the f
1c690 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69  irst that contai
1c6a0 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  ns.** at least o
1c6b0 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e  ne term. Argumen
1c6c0 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20  t (nTerm/pTerm) 
1c6d0 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  is the split-key
1c6e0 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a   - a term that.*
1c6f0 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
1c700 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74   all terms writt
1c710 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65  en to earlier le
1c720 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20  aves, and equal 
1c730 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72  to or.** smaller
1c740 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
1c750 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20  term on the new 
1c760 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  leaf..**.** If a
1c770 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1c780 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1c790 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
1c7a0 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  ex.rc. If an err
1c7b0 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  or.** has alread
1c7c0 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
1c7d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c7e0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1c7f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1c800 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1c810 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73  BtreeTerm(.  Fts
1c820 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c840 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1c850 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
1c860 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1c870 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1c880 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1c890 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
1c8a0 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f  u8 *pTerm      /
1c8b0 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  * First term on 
1c8c0 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  new page */.){. 
1c8d0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
1c8e0 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29  tree(p, pWriter)
1c8f0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  ;.  fts5BufferSe
1c900 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
1c910 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72  er->btterm, nTer
1c920 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72  m, pTerm);.  pWr
1c930 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20  iter->iBtPage = 
1c940 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1c950 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pgno;.}../*.** T
1c960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c970 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73  called when flus
1c980 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65  hing a leaf page
1c990 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
1c9a0 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c  o.** terms at al
1c9b0 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  l to disk..*/.st
1c9c0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1c9d0 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a  iteBtreeNoTerm(.
1c9e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1ca10 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1ca20 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1ca30 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  iter          /*
1ca40 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1ca50 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
1ca60 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64  re were no rowid
1ca70 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61  s on the leaf pa
1ca80 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74 68  ge either and th
1ca90 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a  e doclist-index.
1caa0 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
1cab0 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61   been started, a
1cac0 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79  ppend an 0x00 by
1cad0 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20  te to it.  */.  
1cae0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1caf0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26  rstRowidInPage &
1cb00 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1cb10 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a  x[0].buf.n>0 ){.
1cb20 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1cb30 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
1cb40 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1cb50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1cb60 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1cb70 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
1cb80 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1cb90 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1cba0 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b  pDlidx->buf, 0);
1cbb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
1cbc0 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72  ment the "number
1cbd0 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c   of sequential l
1cbe0 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61 20  eaves without a 
1cbf0 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a  term" counter. *
1cc00 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  /.  pWriter->nEm
1cc10 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63  pty++;.}..static
1cc20 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45 78   i64 fts5DlidxEx
1cc30 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
1cc40 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1cc50 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
1cc60 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20  .  int iOff;..  
1cc70 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47  iOff = 1 + fts5G
1cc80 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
1cc90 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
1cca0 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56  wid);.  fts5GetV
1ccb0 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
1ccc0 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
1ccd0 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  wid);.  return i
1cce0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1ccf0 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
1cd00 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
1cd10 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
1cd20 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74  nt leaf page. It
1cd30 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   is the.** first
1cd40 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68   on the page. Th
1cd50 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
1cd60 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61  nds an appropria
1cd70 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  te entry to the 
1cd80 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69  current.** docli
1cd90 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  st-index..*/.sta
1cda0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1cdb0 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20  teDlidxAppend(. 
1cdc0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1cdd0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1cde0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34  *pWriter, .  i64
1cdf0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74   iRowid.){.  int
1ce00 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20   i;.  int bDone 
1ce10 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
1ce20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ce30 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69  K && bDone==0; i
1ce40 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61  ++){.    i64 iVa
1ce50 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  l;.    Fts5Dlidx
1ce60 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
1ce70 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1ce80 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  x[i];..    if( p
1ce90 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  Dlidx->buf.n>=p-
1cea0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
1ceb0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1cec0 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
1ced0 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75 6c  ndex page is ful
1cee0 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 64  l. Write it to d
1cef0 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20  isk and push.   
1cf00 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20     ** a copy of 
1cf10 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77 69  iRowid (which wi
1cf20 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69  ll become the fi
1cf30 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  rst rowid on the
1cf40 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64   next.      ** d
1cf50 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61  oclist-index lea
1cf60 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20  f page) up into 
1cf70 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f  the next level o
1cf80 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20  f the b-tree .  
1cf90 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79      ** hierarchy
1cfa0 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65  . If the node be
1cfb0 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20 63  ing flushed is c
1cfc0 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f  urrently the roo
1cfd0 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a  t node,.      **
1cfe0 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66   also push its f
1cff0 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61 72  irst rowid upwar
1d000 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c  ds. */.      pDl
1d010 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20  idx->buf.p[0] = 
1d020 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  0x01;    /* Not 
1d030 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  the root node */
1d040 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
1d050 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
1d060 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
1d070 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1d080 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
1d090 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
1d0a0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
1d0b0 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
1d0c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73      );.      fts
1d0d0 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1d0e0 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29  p, pWriter, i+2)
1d0f0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d  ;.      pDlidx =
1d100 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1d110 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x[i];.      if( 
1d120 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d130 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75   && pDlidx[1].bu
1d140 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
1d150 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 66    i64 iFirst = f
1d160 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
1d170 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64  irstRowid(&pDlid
1d180 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20  x->buf);..      
1d190 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68    /* This was th
1d1a0 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73  e root node. Pus
1d1b0 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
1d1c0 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20  d up to the new 
1d1d0 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  root. */.       
1d1e0 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20   pDlidx[1].pgno 
1d1f0 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a  = pDlidx->pgno;.
1d200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1d210 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d220 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d230 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29  Dlidx[1].buf, 0)
1d240 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d250 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d260 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d270 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
1d280 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20  pDlidx->pgno);. 
1d290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1d2a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d2b0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1d2c0 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69  lidx[1].buf, iFi
1d2d0 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44  rst);.        pD
1d2e0 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c  lidx[1].bPrevVal
1d2f0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
1d300 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20  pDlidx[1].iPrev 
1d310 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  = iFirst;.      
1d320 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
1d330 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
1d340 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
1d350 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
1d360 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  vValid = 0;.    
1d370 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b    pDlidx->pgno++
1d380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d390 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
1d3a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c    }..    if( pDl
1d3b0 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1d3c0 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
1d3d0 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d  iRowid - pDlidx-
1d3e0 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  >iPrev;.    }els
1d3f0 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 67  e{.      i64 iPg
1d400 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72  no = (i==0 ? pWr
1d410 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
1d420 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
1d430 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
1d440 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
1d450 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
1d460 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d470 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d480 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1d490 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
1d4a0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d4b0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d4c0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1d4d0 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
1d4e0 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
1d4f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
1d500 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1d510 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d520 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
1d530 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
1d540 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1d550 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
1d560 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
1d570 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1d580 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
1d590 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
1d5a0 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
1d5b0 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
1d5c0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
1d5d0 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
1d5e0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1d5f0 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
1d600 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
1d610 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
1d620 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20    i64 iRowid;.. 
1d630 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 2d   assert( (pPage-
1d640 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70  >pgidx.n==0)==(p
1d650 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d660 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20  rmInPage) );..  
1d670 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1d680 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
1d690 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
1d6a0 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67  fts5GetU16(&pPag
1d6b0 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a  e->buf.p[2]) );.
1d6c0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50    fts5PutU16(&pP
1d6d0 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28  age->buf.p[2], (
1d6e0 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
1d6f0 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65  );..  if( pWrite
1d700 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1d710 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  age ){.    /* No
1d720 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65   term was writte
1d730 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20  n to this page. 
1d740 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d750 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
1d760 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74   );.    fts5Writ
1d770 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20  eBtreeNoTerm(p, 
1d780 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73  pWriter);.  }els
1d790 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  e{.    /* Append
1d7a0 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74 68   the pgidx to th
1d7b0 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20 53  e page buffer. S
1d7c0 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65  et the szLeaf he
1d7d0 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  ader field. */. 
1d7e0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1d7f0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1d800 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61  &pPage->buf, pPa
1d810 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61  ge->pgidx.n, pPa
1d820 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20  ge->pgidx.p);.  
1d830 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
1d840 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69  e page out to di
1d850 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  sk */.  iRowid =
1d860 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1d870 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1d880 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gid, pPage->pgno
1d890 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
1d8a0 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50  te(p, iRowid, pP
1d8b0 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
1d8c0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a  e->buf.n);..  /*
1d8d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1d8e0 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  next page. */.  
1d8f0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1d900 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66  pPage->buf);.  f
1d910 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
1d920 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20  Page->pgidx);.  
1d930 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1d940 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1d950 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
1d960 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72  o);.  pPage->iPr
1d970 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70  evPgidx = 0;.  p
1d980 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
1d990 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
1d9a0 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
1d9b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
1d9c0 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
1d9d0 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en++;..  /* The 
1d9e0 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e  new leaf holds n
1d9f0 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64  o terms or rowid
1da00 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  s */.  pWriter->
1da10 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1da20 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1da30 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1da40 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 1;.}../*.**
1da50 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
1da60 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
1da70 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
1da80 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
1da90 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
1daa0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1dab0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
1dac0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1dad0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
1dae0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
1daf0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1db00 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
1db10 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1db20 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1db30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1db40 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
1db50 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1db60 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1db70 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
1db80 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
1db90 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
1dba0 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
1dbd0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
1dbe0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
1dbf0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1dc00 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1dc10 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35  ->writer;.  Fts5
1dc20 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d  Buffer *pPgidx =
1dc30 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1dc40 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73 65  r.pgidx;..  asse
1dc50 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1dc60 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
1dc70 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
1dc80 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
1dc90 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c  Page->buf.n>4 ||
1dca0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1dcb0 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20  TermInPage );.. 
1dcc0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1dcd0 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  nt leaf page is 
1dce0 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74  full, flush it t
1dcf0 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28  o disk. */.  if(
1dd00 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
1dd10 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65   pPgidx->n + nTe
1dd20 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e  rm + 2)>=p->pCon
1dd30 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
1dd40 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
1dd50 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
1dd60 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1dd70 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1dd80 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
1dd90 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70  rGrow(&p->rc, &p
1dda0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1ddb0 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49  +FTS5_DATA_PADDI
1ddc0 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  NG);.  }.  .  /*
1ddd0 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67   TODO1: Updating
1dde0 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a   pgidx here. */.
1ddf0 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73    pPgidx->n += s
1de00 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
1de10 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67 69  int(.      &pPgi
1de20 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d  dx->p[pPgidx->n]
1de30 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d  , pPage->buf.n -
1de40 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1de50 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d  dx.  );.  pPage-
1de60 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 70 50  >iPrevPgidx = pP
1de70 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20  age->buf.n;.#if 
1de80 30 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26  0.  fts5PutU16(&
1de90 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
1dea0 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
1deb0 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e  .n);.  pPgidx->n
1dec0 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20   += 2;.#endif.. 
1ded0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1dee0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
1def0 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
1df00 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1df10 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
1df20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1df30 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1df40 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e  a leaf that is n
1df50 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20  ot the leftmost 
1df60 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a  leaf in.      **
1df70 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
1df80 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
1df90 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  e it is necessar
1dfa0 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20  y to add a term 
1dfb0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1dfc0 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
1dfd0 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72   that is (a) lar
1dfe0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
1dff0 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20  gest term .     
1e000 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74   ** already writ
1e010 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65  ten to the segme
1e020 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c  nt and (b) small
1e030 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1e040 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69   to.      ** thi
1e050 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72  s term. In other
1e060 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78   words, a prefix
1e070 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   of (pTerm/nTerm
1e080 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20  ) that is one.  
1e090 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67      ** byte long
1e0a0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67  er than the long
1e0b0 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72  est prefix (pTer
1e0c0 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20  m/nTerm) shares 
1e0d0 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a  with the.      *
1e0e0 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e  * previous term.
1e0f0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
1e100 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65   ** Usually, the
1e110 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
1e120 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  s available in p
1e130 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20  Page->term. The 
1e140 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20  exception.      
1e150 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73  ** is if this is
1e160 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1e170 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e  written in an in
1e180 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20  cremental-merge 
1e190 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49  step..      ** I
1e1a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1e1b0 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
1e1c0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
1e1d0 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a  so just write a.
1e1e0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
1e1f0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69   (pTerm/nTerm) i
1e200 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e  nto the parent n
1e210 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69  ode. This is sli
1e220 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69  ghtly.      ** i
1e230 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20  nefficient, but 
1e240 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20  still correct.  
1e250 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
1e260 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66   nTerm;.      if
1e270 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20  ( pPage->term.n 
1e280 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31  ){.        n = 1
1e290 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   + fts5PrefixCom
1e2a0 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
1e2b0 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
1e2c0 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  .p, pTerm);.    
1e2d0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72    }.      fts5Wr
1e2e0 69 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20  iteBtreeTerm(p, 
1e2f0 70 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72  pWriter, n, pTer
1e300 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
1e310 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1e320 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  er;.    }.  }els
1e330 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  e{.    nPrefix =
1e340 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
1e350 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  ess(pPage->term.
1e360 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
1e370 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74  , pTerm);.    ft
1e380 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e390 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1e3a0 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69  age->buf, nPrefi
1e3b0 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  x);.  }..  /* Ap
1e3c0 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20  pend the number 
1e3d0 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
1e3e0 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74  data, then the t
1e3f0 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a  erm data itself.
1e400 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
1e410 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1e420 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1e430 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e440 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
1e450 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ix);.  fts5Buffe
1e460 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1e470 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e480 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
1e490 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &pTerm[nPrefix
1e4a0 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  ]);..  /* Update
1e4b0 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69   the Fts5PageWri
1e4c0 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20  ter.term field. 
1e4d0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  */.  fts5BufferS
1e4e0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  et(&p->rc, &pPag
1e4f0 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  e->term, nTerm, 
1e500 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65  pTerm);.  pWrite
1e510 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1e520 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69  age = 0;..  pWri
1e530 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e540 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57  InPage = 0;.  pW
1e550 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1e560 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b  idInDoclist = 1;
1e570 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1e580 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  c || (pWriter->n
1e590 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
1e5a0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1e5b0 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72  f.n==0) );.  pWr
1e5c0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1e5d0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
1e5e0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  no;.}../*.** App
1e5f0 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20  end a rowid and 
1e600 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
1e610 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  ze field to the 
1e620 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
1e630 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e640 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
1e650 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
1e660 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1e670 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1e680 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
1e690 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1e6a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
1e6b0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1e6c0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1e6d0 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66  >writer;..    if
1e6e0 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
1e6f0 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
1e700 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
1e710 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
1e720 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1e730 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1e740 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1e750 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65 20  is is to be the 
1e760 66 69 72 73 74 20 72 6f 77 69 64 20 77 72 69 74  first rowid writ
1e770 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ten to the page,
1e780 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a   set the .    **
1e790 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69   rowid-pointer i
1e7a0 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  n the page-heade
1e7b0 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61  r. Also append a
1e7c0 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c   value to the dl
1e7d0 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65  idx.    ** buffe
1e7e0 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63  r, in case a doc
1e7f0 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65  list-index is re
1e800 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20  quired.  */.    
1e810 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1e820 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1e830 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55  {.      fts5PutU
1e840 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  16(pPage->buf.p,
1e850 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66   (u16)pPage->buf
1e860 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57  .n);.      fts5W
1e870 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
1e880 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77  p, pWriter, iRow
1e890 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
1e8a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 6f 77  /* Write the row
1e8b0 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  id. */.    if( p
1e8c0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1e8d0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20  widInDoclist || 
1e8e0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1e8f0 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
1e900 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1e910 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1e920 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1e930 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c  iRowid);.    }el
1e940 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e950 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69  ( p->rc || iRowi
1e960 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76  d>pWriter->iPrev
1e970 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66  Rowid );.      f
1e980 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1e990 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1e9a0 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
1e9b0 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72  d - pWriter->iPr
1e9c0 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  evRowid);.    }.
1e9d0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72      pWriter->iPr
1e9e0 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  evRowid = iRowid
1e9f0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
1ea00 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
1ea10 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72  ist = 0;.    pWr
1ea20 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1ea30 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  dInPage = 0;.  }
1ea40 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1ea50 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
1ea60 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74  oslistData(.  Ft
1ea70 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1ea80 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1ea90 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20  riter, .  const 
1eaa0 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e  u8 *aData, .  in
1eab0 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73  t nData.){.  Fts
1eac0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1ead0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1eae0 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75  riter;.  const u
1eaf0 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20  8 *a = aData;.  
1eb00 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20  int n = nData;. 
1eb10 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70   .  assert( p->p
1eb20 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29  Config->pgsz>0 )
1eb30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
1eb40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
1eb50 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66    && (pPage->buf
1eb60 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64  .n + pPage->pgid
1eb70 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f  x.n + n)>=p->pCo
1eb80 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b  nfig->pgsz .  ){
1eb90 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20  .    int nReq = 
1eba0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1ebb0 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20   - pPage->buf.n 
1ebc0 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  - pPage->pgidx.n
1ebd0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20  ;.    int nCopy 
1ebe0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
1ebf0 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20  nCopy<nReq ){.  
1ec00 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20      i64 dummy;. 
1ec10 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74       nCopy += ft
1ec20 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e  s5GetVarint(&a[n
1ec30 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75  Copy], (u64*)&du
1ec40 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  mmy);.    }.    
1ec50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1ec60 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1ec70 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c  age->buf, nCopy,
1ec80 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43   a);.    a += nC
1ec90 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43  opy;.    n -= nC
1eca0 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69  opy;.    fts5Wri
1ecb0 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1ecc0 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69  Writer);.  }.  i
1ecd0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74  f( n>0 ){.    ft
1ece0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1ecf0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1ed00 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20  e->buf, n, a);. 
1ed10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73   }.}../*.** Flus
1ed20 68 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65  h any data cache
1ed30 64 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20  d by the writer 
1ed40 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61  object to the da
1ed50 74 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79  tabase. Free any
1ed60 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  .** allocations 
1ed70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ed80 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73  the writer..*/.s
1ed90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1eda0 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74  riteFinish(.  Ft
1edb0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1edc0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1edd0 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
1ede0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
1edf0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66  */.  int *pnLeaf
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
1ee20 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
1ee30 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29  s in b-tree */.)
1ee40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
1ee50 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65  5PageWriter *pLe
1ee60 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  af = &pWriter->w
1ee70 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e  riter;.  if( p->
1ee80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ee90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1eea0 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20  af->pgno>=1 );. 
1eeb0 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75     if( pLeaf->bu
1eec0 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66  f.n>4 ){.      f
1eed0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1eee0 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1eef0 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66     }.    *pnLeaf
1ef00 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31   = pLeaf->pgno-1
1ef10 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  ;.    if( pLeaf-
1ef20 3e 70 67 6e 6f 3e 31 20 29 7b 0a 20 20 20 20 20  >pgno>1 ){.     
1ef30 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
1ef40 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29  tree(p, pWriter)
1ef50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  ;.    }.  }.  ft
1ef60 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1ef70 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  eaf->term);.  ft
1ef80 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1ef90 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  eaf->buf);.  fts
1efa0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65  5BufferFree(&pLe
1efb0 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74  af->pgidx);.  ft
1efc0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
1efd0 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a  riter->btterm);.
1efe0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
1eff0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
1f000 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1f010 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
1f020 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1f030 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73  i].buf);.  }.  s
1f040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
1f050 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a  ter->aDlidx);.}.
1f060 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1f070 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74  5WriteInit(.  Ft
1f080 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1f090 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1f0a0 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53  riter, .  int iS
1f0b0 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  egid.){.  const 
1f0c0 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d  int nBuffer = p-
1f0d0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b  >pConfig->pgsz +
1f0e0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49   FTS5_DATA_PADDI
1f0f0 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57  NG;..  memset(pW
1f100 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1f110 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1f120 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
1f130 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20  gid = iSegid;.. 
1f140 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
1f150 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
1f160 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77  1);.  pWriter->w
1f170 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a  riter.pgno = 1;.
1f180 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1f190 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
1f1a0 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
1f1b0 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  age = 1;..  asse
1f1c0 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69  rt( pWriter->wri
1f1d0 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a  ter.buf.n==0 );.
1f1e0 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
1f1f0 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2e  r->writer.pgidx.
1f200 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72  n==0 );..  /* Gr
1f210 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66 65  ow the two buffe
1f220 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64  rs to pgsz + pad
1f230 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69  ding bytes in si
1f240 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ze. */.  sqlite3
1f250 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
1f260 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
1f270 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e  >writer.pgidx, n
1f280 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c 69 74  Buffer);.  sqlit
1f290 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
1f2a0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
1f2b0 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e  r->writer.buf, n
1f2c0 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28 20  Buffer);..  if( 
1f2d0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30  p->pIdxWriter==0
1f2e0 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
1f2f0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
1f300 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74  >pConfig;.    ft
1f310 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
1f320 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72  mt(p, &p->pIdxWr
1f330 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
1f340 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1f350 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25   "INSERT INTO '%
1f360 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69  q'.'%q_idx'(segi
1f370 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c  d,term,pgno) VAL
1f380 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20  UES(?,?,?)", .  
1f390 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
1f3a0 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
1f3b0 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d  Name.    ));.  }
1f3c0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1f3d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f3e0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1f3f0 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70 61  e 4-byte leaf-pa
1f400 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78 30  ge header to 0x0
1f410 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  0. */.    memset
1f420 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  (pWriter->writer
1f430 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20  .buf.p, 0, 4);. 
1f440 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74     pWriter->writ
1f450 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20  er.buf.n = 4;.. 
1f460 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 63     /* Bind the c
1f470 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73 65  urrent output se
1f480 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65 20  gment id to the 
1f490 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54 68  index-writer. Th
1f4a0 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  is is an.    ** 
1f4b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65  optimization ove
1f4c0 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73 61  r binding the sa
1f4d0 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61 6e  me value over an
1f4e0 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20 61  d over as rows a
1f4f0 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
1f500 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62 79  ed into %_idx by
1f510 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72 69   the current wri
1f520 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ter.  */.    sql
1f530 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
1f540 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20  >pIdxWriter, 1, 
1f550 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29  pWriter->iSegid)
1f560 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1f570 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77 61  terator pIter wa
1f580 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
1f590 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  e through the in
1f5a0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  put segments of 
1f5b0 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65  on an.** increme
1f5c0 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
1f5d0 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
1f5e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66  ion is called if
1f5f0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1f600 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68  .** merge step h
1f610 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74 20  as finished but 
1f620 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f  the input has no
1f630 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  t been completel
1f640 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a  y exhausted..*/.
1f650 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1f660 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73  TrimSegments(Fts
1f670 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
1f680 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
1f690 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66  nt i;.  Fts5Buff
1f6a0 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74  er buf;.  memset
1f6b0 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
1f6c0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
1f6d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
1f6e0 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
1f6f0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1f700 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
1f710 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Seg[i];.    if( 
1f720 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  pSeg->pSeg==0 ){
1f730 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
1f740 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
1f750 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
1f760 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  ){.      /* All 
1f770 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69  keys from this i
1f780 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76  nput segment hav
1f790 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65  e been transfere
1f7a0 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  d to the output.
1f7b0 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f  .      ** Set bo
1f7c0 74 68 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  th the first and
1f7d0 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65   last page-numbe
1f7e0 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  rs to 0 to indic
1f7f0 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ate that the.   
1f800 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
1f810 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20   now empty. */. 
1f820 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
1f830 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20  >pgnoLast = 0;. 
1f840 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
1f850 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a  >pgnoFirst = 0;.
1f860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f870 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67   int iOff = pSeg
1f880 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
1f890 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  t;     /* Offset
1f8a0 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65   on new first le
1f8b0 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  af page */.     
1f8c0 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b   i64 iLeafRowid;
1f8d0 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20  .      Fts5Data 
1f8e0 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e  *pData;.      in
1f8f0 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53  t iId = pSeg->pS
1f900 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
1f910 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b    u8 aHdr[4] = {
1f920 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1f930 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20  , 0x00};..      
1f940 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53  iLeafRowid = FTS
1f950 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1f960 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d  iId, pSeg->iTerm
1f970 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
1f980 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
1f990 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f  aRead(p, iLeafRo
1f9a0 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
1f9b0 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
1f9c0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1f9d0 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  &buf);.        f
1f9e0 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
1f9f0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1fa00 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20  a->nn);.        
1fa10 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fa20 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1fa30 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c  f, sizeof(aHdr),
1fa40 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   aHdr);.        
1fa50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fa60 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1fa70 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1fa80 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
1fa90 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1faa0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1fab0 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65  Seg->term.n, pSe
1fac0 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20  g->term.p);.    
1fad0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fae0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1faf0 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a   &buf, pData->sz
1fb00 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70 44 61 74  Leaf-iOff, &pDat
1fb10 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  a->p[iOff]);.   
1fb20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1fb30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fb40 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68         /* Set th
1fb50 65 20 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a  e szLeaf field *
1fb60 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  /.          fts5
1fb70 50 75 74 55 31 36 28 26 62 75 66 2e 70 5b 32 5d  PutU16(&buf.p[2]
1fb80 2c 20 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a 20  , (u16)buf.n);. 
1fb90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1fba0 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
1fbb0 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61  new page-index a
1fbc0 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  rray */.        
1fbd0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fbe0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1fbf0 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  buf, 4);.       
1fc00 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
1fc10 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72  Pgno==pSeg->iTer
1fc20 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20  mLeafPgno .     
1fc30 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e      && pSeg->iEn
1fc40 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61  dofDoclist<pData
1fc50 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20  ->szLeaf .      
1fc60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1fc70 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61  nt nDiff = pData
1fc80 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d  ->szLeaf - pSeg-
1fc90 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a  >iEndofDoclist;.
1fca0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1fcb0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1fcc0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62  (&p->rc, &buf, b
1fcd0 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66  uf.n - 1 - nDiff
1fce0 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   - 4);.         
1fcf0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fd00 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1fd10 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  uf, .           
1fd20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70     pData->nn - p
1fd30 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20  Seg->iPgidxOff, 
1fd40 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e  &pData->p[pSeg->
1fd50 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20 20 20  iPgidxOff].     
1fd60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1fd70 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  }..        fts5D
1fd80 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
1fd90 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
1fda0 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1fdb0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1fdc0 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  afPgno;.        
1fdd0 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
1fde0 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
1fdf0 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c  OWID(iId, 1), iL
1fe00 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1fe10 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
1fe20 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20  (p, iLeafRowid, 
1fe30 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20  buf.p, buf.n);. 
1fe40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fe50 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1fe60 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74  e(&buf);.}..stat
1fe70 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
1fe80 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a  eChunkCallback(.
1fe90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1fea0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
1feb0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
1fec0 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
1fed0 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  {.  Fts5SegWrite
1fee0 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74  r *pWriter = (Ft
1fef0 73 35 53 65 67 57 72 69 74 65 72 2a 29 70 43 74  s5SegWriter*)pCt
1ff00 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  x;.  fts5WriteAp
1ff10 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
1ff20 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68 75  p, pWriter, pChu
1ff30 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a  nk, nChunk);.}..
1ff40 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
1ff50 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
1ff60 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35  rgeLevel(.  Fts5
1ff70 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ff90 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1ffa0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1ffb0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1ffc0 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
1ffd0 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69  T: Stucture of i
1ffe0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
1fff0 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
20000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
20010 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  el to read input
20020 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
20030 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20  pnRem           
20040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
20050 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d  ite up to this m
20060 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65  any output leave
20070 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  s */.){.  Fts5St
20080 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
20090 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
200a0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
200b0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
200c0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
200d0 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ];.  Fts5Structu
200e0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74  reLevel *pLvlOut
200f0 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49  ;.  Fts5Iter *pI
20100 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
20110 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65  * Iterator to re
20120 61 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f  ad input data */
20130 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e  .  int nRem = pn
20140 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30  Rem ? *pnRem : 0
20150 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61  ;  /* Output lea
20160 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
20170 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
20180 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
20190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
201a0 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
201b0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
201c0 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
201d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
201e0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
201f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
20200 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
20210 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d    /* Output segm
20220 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ent */.  Fts5Buf
20230 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20  fer term;.  int 
20240 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20  bOldest;        
20250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20260 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 70 75  rue if the outpu
20270 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65  t segment is the
20280 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74   oldest */.  int
20290 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
202a0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
202b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
202c0 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
202d0 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20  ERY_NOOUTPUT;.  
202e0 69 6e 74 20 62 54 65 72 6d 57 72 69 74 74 65 6e  int bTermWritten
202f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20300 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72 72 65  /* True if curre
20310 6e 74 20 74 65 72 6d 20 61 6c 72 65 61 64 79 20  nt term already 
20320 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20 61 73 73  output */..  ass
20330 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63  ert( iLvl<pStruc
20340 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61  t->nLevel );.  a
20350 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65  ssert( pLvl->nMe
20360 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20  rge<=pLvl->nSeg 
20370 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72  );..  memset(&wr
20380 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
20390 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b  Fts5SegWriter));
203a0 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c  .  memset(&term,
203b0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
203c0 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70  uffer));.  if( p
203d0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
203e0 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53     pLvlOut = &pS
203f0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
20400 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  vl+1];.    asser
20410 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  t( pLvlOut->nSeg
20420 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74  >0 );.    nInput
20430 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
20440 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
20450 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
20460 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20  ut->nSeg-1];..  
20470 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
20480 70 2c 20 26 77 72 69 74 65 72 2c 20 70 53 65 67  p, &writer, pSeg
20490 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 77  ->iSegid);.    w
204a0 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67 6e  riter.writer.pgn
204b0 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  o = pSeg->pgnoLa
204c0 73 74 2b 31 3b 0a 20 20 20 20 77 72 69 74 65 72  st+1;.    writer
204d0 2e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 20 20  .iBtPage = 0;.  
204e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
204f0 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f  Segid = fts5Allo
20500 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74  cateSegid(p, pSt
20510 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  ruct);..    /* E
20520 78 74 65 6e 64 20 74 68 65 20 46 74 73 35 53 74  xtend the Fts5St
20530 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 61  ructure object a
20540 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e  s required to en
20550 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74 0a  sure the output.
20560 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65      ** segment e
20570 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66  xists. */.    if
20580 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d  ( iLvl==pStruct-
20590 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20  >nLevel-1 ){.   
205a0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
205b0 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  AddLevel(&p->rc,
205c0 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20   ppStruct);.    
205d0 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53    pStruct = *ppS
205e0 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20  truct;.    }.   
205f0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
20600 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
20610 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b  , pStruct, iLvl+
20620 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  1, 1, 0);.    if
20630 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
20640 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53  ;.    pLvl = &pS
20650 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
20660 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74  vl];.    pLvlOut
20670 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
20680 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20  vel[iLvl+1];..  
20690 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
206a0 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65 67  p, &writer, iSeg
206b0 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  id);..    /* Add
206c0 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   the new segment
206d0 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6c   to the output l
206e0 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67  evel */.    pSeg
206f0 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
20700 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d  g[pLvlOut->nSeg]
20710 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e  ;.    pLvlOut->n
20720 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d  Seg++;.    pSeg-
20730 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
20740 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
20750 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 70   = iSegid;.    p
20760 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
20770 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  ++;..    /* Read
20780 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20   input from all 
20790 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  segments in the 
207a0 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  input level */. 
207b0 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
207c0 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f  ->nSeg;.  }.  bO
207d0 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74  ldest = (pLvlOut
207e0 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74  ->nSeg==1 && pSt
207f0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c  ruct->nLevel==iL
20800 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72 74  vl+2);..  assert
20810 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66  ( iLvl>=0 );.  f
20820 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
20830 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
20840 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20  flags, 0, 0, 0, 
20850 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70  iLvl, nInput, &p
20860 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
20870 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
20880 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
20890 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
208a0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
208b0 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73   0).  ){.    Fts
208c0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 49 74  5SegIter *pSegIt
208d0 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
208e0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
208f0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
20900 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20920 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  /* position-list
20930 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75   size field valu
20940 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
20950 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38  rm;.    const u8
20960 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 70 54   *pTerm;..    pT
20970 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
20980 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
20990 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
209a0 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c  nTerm!=term.n ||
209b0 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74   memcmp(pTerm, t
209c0 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b  erm.p, nTerm) ){
209d0 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d  .      if( pnRem
209e0 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   && writer.nLeaf
209f0 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a  Written>nRem ){.
20a00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
20a20 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
20a30 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  c, &term, nTerm,
20a40 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62   pTerm);.      b
20a50 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b 0a  TermWritten =0;.
20a60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
20a70 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69  eck for key anni
20a80 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  hilation. */.   
20a90 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
20aa0 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65  Pos==0 && (bOlde
20ab0 73 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e  st || pSegIter->
20ac0 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69  bDel==0) ) conti
20ad0 6e 75 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  nue;..    if( p-
20ae0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
20af0 26 20 62 54 65 72 6d 57 72 69 74 74 65 6e 3d 3d  & bTermWritten==
20b00 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
20b10 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
20b20 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20  . Append a term 
20b30 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  to the output se
20b40 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  gment. */.      
20b50 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
20b60 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
20b70 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
20b80 20 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65       bTermWritte
20b90 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 1;.    }..  
20ba0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
20bb0 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74  rowid to the out
20bc0 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52  put */.    /* WR
20bd0 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
20be0 2f 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41  /.    fts5WriteA
20bf0 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77  ppendRowid(p, &w
20c00 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69  riter, fts5Multi
20c10 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
20c20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74  );..    if( eDet
20c30 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
20c40 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
20c50 66 28 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65  f( pSegIter->bDe
20c60 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  l ){.        fts
20c70 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
20c80 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69  int(&p->rc, &wri
20c90 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20  ter.writer.buf, 
20ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
20cb0 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30  pSegIter->nPos>0
20cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
20cd0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20ce0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
20cf0 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
20d00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
20d10 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
20d20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  {.      /* Appen
20d30 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  d the position-l
20d40 69 73 74 20 64 61 74 61 20 74 6f 20 74 68 65 20  ist data to the 
20d50 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20  output */.      
20d60 6e 50 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d  nPos = pSegIter-
20d70 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74  >nPos*2 + pSegIt
20d80 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20  er->bDel;.      
20d90 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20da0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
20db0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
20dc0 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  f, nPos);.      
20dd0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
20de0 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76  (p, pSegIter, (v
20df0 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74  oid*)&writer, ft
20e00 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
20e10 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  back);.    }.  }
20e20 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
20e30 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
20e40 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65  to disk. Set the
20e50 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
20e60 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20  b-tree height.  
20e70 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66  ** and last leaf
20e80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20   page number at 
20e90 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
20ea0 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69  */.  fts5WriteFi
20eb0 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
20ec0 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74   &pSeg->pgnoLast
20ed0 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75  );..  if( fts5Mu
20ee0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
20ef0 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ter) ){.    int 
20f00 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  i;..    /* Remov
20f10 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
20f20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
20f30 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  e %_data table *
20f40 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
20f50 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
20f60 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d       fts5DataRem
20f70 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c  oveSegment(p, pL
20f80 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67  vl->aSeg[i].iSeg
20f90 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
20fa0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
20fb0 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
20fc0 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
20fd0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
20fe0 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e   pLvl->nSeg!=nIn
20ff0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  put ){.      int
21000 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e   nMove = (pLvl->
21010 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a  nSeg - nInput) *
21020 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
21030 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
21040 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76       memmove(pLv
21050 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  l->aSeg, &pLvl->
21060 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d  aSeg[nInput], nM
21070 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ove);.    }.    
21080 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
21090 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  t -= nInput;.   
210a0 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
210b0 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
210c0 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
210d0 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
210e0 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
210f0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
21100 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
21110 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  nSegment--;.    
21120 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
21130 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e  ssert( pSeg->pgn
21140 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66  oLast>0 );.    f
21150 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
21160 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
21170 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49  Lvl->nMerge = nI
21180 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  nput;.  }..  fts
21190 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
211a0 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  Iter);.  fts5Buf
211b0 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
211c0 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70    if( pnRem ) *p
211d0 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e  nRem -= writer.n
211e0 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a  LeafWritten;.}..
211f0 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e  /*.** Do up to n
21200 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f  Pg pages of auto
21210 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68  merge work on th
21220 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e index..**.** R
21230 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
21240 79 20 63 68 61 6e 67 65 73 20 77 65 72 65 20 61  y changes were a
21250 63 74 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72  ctually made, or
21260 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
21270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21280 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a  fts5IndexMerge(.
21290 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
212c0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
212d0 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
212e0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
212f0 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
21300 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
21310 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67  dex */.  int nPg
21320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21330 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
21340 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s of work to do 
21350 2a 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20  */.  int nMin   
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
21380 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
21390 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  ts to merge */.)
213a0 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  {.  int nRem = n
213b0 50 67 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d  Pg;.  int bRet =
213c0 20 30 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74   0;.  Fts5Struct
213d0 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
213e0 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c  ppStruct;.  whil
213f0 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e  e( nRem>0 && p->
21400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21410 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
21440 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
21450 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76  .    int iBestLv
21460 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
21470 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69   /* Level offeri
21480 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75  ng the most inpu
21490 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
214a0 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b    int nBest = 0;
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
214c0 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
214d0 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73   segments on bes
214e0 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20  t level */..    
214f0 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20  /* Set iBestLvl 
21500 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20  to the level to 
21510 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65  read input segme
21520 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20  nts from. */.   
21530 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
21540 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
21550 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
21560 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
21570 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
21580 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
21590 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
215a0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
215b0 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Lvl];.      if( 
215c0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
215d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
215e0 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29  ->nMerge>nBest )
215f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73  {.          iBes
21600 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
21610 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
21620 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
21630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
21640 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21650 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
21660 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  eg>nBest ){.    
21670 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
21680 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20  ->nSeg;.        
21690 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
216a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
216b0 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20      /* If nBest 
216c0 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e  is still 0, then
216d0 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
216e0 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66  be empty. */.#if
216f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21700 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
21710 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76   nBest==0 && iLv
21720 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
21730 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
21740 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
21750 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
21760 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  nSeg==0 );.    }
21770 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
21780 20 6e 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70   nBest<nMin && p
21790 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
217a0 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
217b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
217c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 52 65  k;.    }.    bRe
217d0 74 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 49  t = 1;.    fts5I
217e0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
217f0 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
21800 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
21810 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
21820 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
21830 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
21840 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  vl].nMerge==0 ){
21850 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
21860 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
21870 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75  BestLvl+1, pStru
21880 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ct);.    }.  }. 
21890 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
218a0 72 75 63 74 3b 0a 20 20 72 65 74 75 72 6e 20 62  ruct;.  return b
218b0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  Ret;.}../*.** A 
218c0 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c  total of nLeaf l
218d0 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74  eaf pages of dat
218e0 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  a has just been 
218f0 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76  flushed to a lev
21900 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e  el-0.** segment.
21910 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   This function u
21920 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65  pdates the write
21930 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69  -counter accordi
21940 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20  ngly and, if.** 
21950 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f  necessary, perfo
21960 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  rms incremental 
21970 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  merge work..**.*
21980 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
21990 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
219a0 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
219b0 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
219c0 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
219d0 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
219e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
219f0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
21a00 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41   void fts5IndexA
21a10 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35  utomerge(.  Fts5
21a20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
21a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21a40 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
21a50 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
21a60 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
21a70 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
21a80 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
21a90 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
21aa0 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20  .  int nLeaf    
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ac0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21ad0 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75  output leaves ju
21ae0 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  st written */.){
21af0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
21b00 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43  LITE_OK && p->pC
21b10 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
21b20 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  e>0 ){.    Fts5S
21b30 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
21b40 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
21b50 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20     u64 nWrite;  
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b70 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
21b80 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74  e of write-count
21b90 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57  er */.    int nW
21ba0 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
21bb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21bc0 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61  r of work-quanta
21bd0 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20   to perform */. 
21be0 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20     int nRem;    
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
21c10 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f  af pages left to
21c20 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f   write */..    /
21c30 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
21c40 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
21c50 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
21c60 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57  nWork. */.    nW
21c70 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e  rite = pStruct->
21c80 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
21c90 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29     nWork = (int)
21ca0 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61  (((nWrite + nLea
21cb0 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
21cc0 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
21cd0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20  ->nWorkUnit));. 
21ce0 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69     pStruct->nWri
21cf0 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65  teCounter += nLe
21d00 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28  af;.    nRem = (
21d10 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69  int)(p->nWorkUni
21d20 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72  t * nWork * pStr
21d30 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20  uct->nLevel);.. 
21d40 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
21d50 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e  e(p, ppStruct, n
21d60 52 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  Rem, p->pConfig-
21d70 3e 6e 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20  >nAutomerge);.  
21d80 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
21d90 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
21da0 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  merge(.  Fts5Ind
21db0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
21dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
21dd0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
21de0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
21df0 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20  re **ppStruct   
21e00 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
21e10 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
21e20 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  e of index */.){
21e30 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72  .  const int nCr
21e40 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  isis = p->pConfi
21e50 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b  g->nCrisisMerge;
21e60 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
21e70 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
21e80 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76  truct;.  int iLv
21e90 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
21ea0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
21eb0 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e  OK || pStruct->n
21ec0 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69  Level>0 );.  whi
21ed0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
21ee0 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
21ef0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
21f00 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20  eg>=nCrisis ){. 
21f10 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
21f20 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75  eLevel(p, &pStru
21f30 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20  ct, iLvl, 0);.  
21f40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
21f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
21f60 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69  truct->nLevel>(i
21f70 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74  Lvl+1) );.    ft
21f80 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
21f90 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53  te(p, iLvl+1, pS
21fa0 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c  truct);.    iLvl
21fb0 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72  ++;.  }.  *ppStr
21fc0 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d  uct = pStruct;.}
21fd0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
21fe0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73  5IndexReturn(Fts
21ff0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
22000 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
22010 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
22020 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  K;.  return rc;.
22030 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
22040 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46  t Fts5FlushCtx F
22050 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72  ts5FlushCtx;.str
22060 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
22070 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
22080 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57  pIdx;.  Fts5SegW
22090 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d  riter writer; .}
220a0 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  ;../*.** Buffer 
220b0 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  aBuf[] contains 
220c0 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  a list of varint
220d0 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f  s, all small eno
220e0 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e  ugh to fit.** in
220f0 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
22100 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  r. Return the si
22110 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
22120 74 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73  t prefix of this
22130 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62   .** list nMax b
22140 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20  ytes or less in 
22150 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
22160 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50  int fts5PoslistP
22170 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a  refix(const u8 *
22180 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b  aBuf, int nMax){
22190 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33  .  int ret;.  u3
221a0 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d  2 dummy;.  ret =
221b0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
221c0 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20  (aBuf, dummy);. 
221d0 20 69 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b   if( ret<nMax ){
221e0 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
221f0 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66  .      int i = f
22200 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
22210 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79  aBuf[ret], dummy
22220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72 65  );.      if( (re
22230 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20  t + i) > nMax ) 
22240 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74  break;.      ret
22250 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d   += i;.    }.  }
22260 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
22270 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68  ../*.** Flush th
22280 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  e contents of in
22290 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
222a0 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65  le iHash to a ne
222b0 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65  w level-0 .** se
222c0 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41  gment on disk. A
222d0 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63  lso update the c
222e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
222f0 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
22300 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
22310 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
22320 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
22330 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
22340 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
22350 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
22360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
22370 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
22380 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75  tic void fts5Flu
22390 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e  shOneHash(Fts5In
223a0 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48  dex *p){.  Fts5H
223b0 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e  ash *pHash = p->
223c0 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72  pHash;.  Fts5Str
223d0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
223e0 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
223f0 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
22400 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22410 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20     /* Last leaf 
22420 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
22430 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  egment */..  /* 
22440 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
22450 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ce to the index 
22460 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
22470 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
22480 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72  ment-id.  ** for
22490 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30   the new level-0
224a0 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20   segment.  */.  
224b0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
224c0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
224d0 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41    iSegid = fts5A
224e0 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
224f0 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
22500 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
22510 61 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 69  ate(p);..  if( i
22520 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e  Segid ){.    con
22530 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d  st int pgsz = p-
22540 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a  >pConfig->pgsz;.
22550 20 20 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20      int eDetail 
22560 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
22570 65 74 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53  etail;.    Fts5S
22580 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
22590 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20  *pSeg;   /* New 
225a0 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70  segment within p
225b0 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74  Struct */.    Ft
225c0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
225d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
225e0 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
225f0 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20  o assemble leaf 
22600 70 61 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35  page */.    Fts5
22610 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20  Buffer *pPgidx; 
22620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
22630 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
22640 61 73 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a  assemble pgidx *
22650 2f 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72  /..    Fts5SegWr
22660 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
22670 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
22680 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69  , &writer, iSegi
22690 64 29 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20  d);..    pBuf = 
226a0 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
226b0 75 66 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d  uf;.    pPgidx =
226c0 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
226d0 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66  pgidx;..    /* f
226e0 74 73 35 57 72 69 74 65 49 6e 69 74 28 29 20 73  ts5WriteInit() s
226f0 68 6f 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69  hould have initi
22700 61 6c 69 7a 65 64 20 74 68 65 20 62 75 66 66 65  alized the buffe
22710 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65  rs to (most like
22720 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d  ly).    ** the m
22730 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
22740 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73  uired. */.    as
22750 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70  sert( p->rc || p
22760 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67  Buf->nSpace>=(pg
22770 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
22780 41 44 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61  ADDING) );.    a
22790 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
227a0 70 50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d  pPgidx->nSpace>=
227b0 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54  (pgsz + FTS5_DAT
227c0 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20  A_PADDING) );.. 
227d0 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e     /* Begin scan
227e0 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73  ning through has
227f0 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e  h table entries.
22800 20 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   This loop runs 
22810 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20  once for each.  
22820 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73    ** term/doclis
22830 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
22840 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61  ed within the ha
22850 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  sh table. */.   
22860 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
22870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
22880 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
22890 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
228a0 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Hash, 0, 0);.   
228b0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d   }.    while( p-
228c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
228d0 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  & 0==sqlite3Fts5
228e0 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73  HashScanEof(pHas
228f0 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  h) ){.      cons
22900 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20  t char *zTerm;  
22910 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
22920 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
22930 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  m */.      const
22940 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20   u8 *pDoclist;  
22950 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22960 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72  r to doclist for
22970 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
22980 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
22990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229a0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
229b0 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  st in bytes */..
229c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
229d0 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73  he term for this
229e0 20 65 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20   entry to disk. 
229f0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
22a00 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
22a10 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  y(pHash, &zTerm,
22a20 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f   &pDoclist, &nDo
22a30 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  clist);.      ft
22a40 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
22a50 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69  m(p, &writer, (i
22a60 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29  nt)strlen(zTerm)
22a70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65  , (const u8*)zTe
22a80 72 6d 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  rm);..      asse
22a90 72 74 28 20 77 72 69 74 65 72 2e 62 46 69 72 73  rt( writer.bFirs
22aa0 74 52 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20  tRowidInPage==0 
22ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 73  );.      if( pgs
22ac0 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  z>=(pBuf->n + pP
22ad0 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69  gidx->n + nDocli
22ae0 73 74 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20  st + 1) ){.     
22af0 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
22b00 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69   doclist will fi
22b10 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
22b20 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20   leaf. */.      
22b30 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
22b40 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
22b50 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c   pDoclist, nDocl
22b60 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ist);.      }els
22b70 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  e{.        i64 i
22b80 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
22b90 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
22ba0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
22bb0 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Off = 0;..      
22bc0 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
22bd0 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  doclist will not
22be0 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
22bf0 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  f. The following
22c00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f   .        ** loo
22c10 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  p iterates throu
22c20 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20  gh the poslists 
22c30 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
22c40 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20   current .      
22c50 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a    ** doclist.  *
22c60 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
22c70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
22c80 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69  K && iOff<nDocli
22c90 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
22ca0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
22cb0 61 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b  arint(&pDoclist[
22cc0 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
22cd0 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  elta);.         
22ce0 20 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74   iRowid += iDelt
22cf0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  a;.          .  
22d00 20 20 20 20 20 20 20 20 69 66 28 20 77 72 69 74          if( writ
22d10 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
22d20 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
22d30 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
22d40 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36  pBuf->p[0], (u16
22d50 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20  )pBuf->n);   /* 
22d60 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
22d70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
22d80 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
22d90 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
22da0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
22db0 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ->n], iRowid);. 
22dc0 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65             write
22dd0 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
22de0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
22df0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
22e00 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72  idxAppend(p, &wr
22e10 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
22e20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
22e30 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
22e40 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
22e50 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
22e60 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
22e70 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
22e80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
22e90 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70  sert( pBuf->n<=p
22ea0 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a  Buf->nSpace );..
22eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 44            if( eD
22ec0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
22ed0 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
22ee0 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c         if( iOff<
22ef0 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63  nDoclist && pDoc
22f00 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b  list[iOff]==0 ){
22f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22f20 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
22f30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
22f40 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
22f50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
22f60 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20  Off<nDoclist && 
22f70 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d  pDoclist[iOff]==
22f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
22f90 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75       pBuf->p[pBu
22fa0 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  f->n++] = 0;.   
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66               iOf
22fc0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  f++;.           
22fd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22fe0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
22ff0 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
23000 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29  gidx->n)>=pgsz )
23010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23020 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
23030 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  af(p, &writer);.
23040 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23050 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23060 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
23070 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  Dummy;.         
23080 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
23090 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f           int nCo
230a0 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  py = fts5GetPosl
230b0 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73  istSize(&pDoclis
230c0 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  t[iOff], &nPos, 
230d0 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  &bDummy);.      
230e0 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e        nCopy += n
230f0 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
23100 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
23110 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70  pPgidx->n + nCop
23120 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20  y) <= pgsz ){.  
23130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23140 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73  he entire poslis
23150 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
23160 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
23170 53 6f 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20  So copy.        
23180 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f        ** it in o
23190 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  ne go. */.      
231a0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
231b0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
231c0 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74  (pBuf, &pDoclist
231d0 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a  [iOff], nCopy);.
231e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
231f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
23200 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
23210 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20  oslist will not 
23220 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66  fit on this leaf
23230 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20  . So it needs.  
23240 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
23250 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f  o be broken into
23260 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f   sections. The o
23270 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f  nly qualificatio
23280 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  n being.        
23290 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61        ** that ea
232a0 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62  ch varint must b
232b0 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75  e stored contigu
232c0 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20  ously.  */.     
232d0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75           const u
232e0 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70  8 *pPoslist = &p
232f0 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20  Doclist[iOff];. 
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
23310 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20   iPos = 0;.     
23320 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
23330 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
23340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23350 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d      int nSpace =
23360 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20   pgsz - pBuf->n 
23370 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20  - pPgidx->n;.   
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
23390 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
233a0 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f          if( (nCo
233b0 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61  py - iPos)<=nSpa
233c0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
233d0 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70          n = nCop
233e0 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20  y - iPos;.      
233f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23410 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69     n = fts5Posli
23420 73 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69  stPrefix(&pPosli
23430 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65  st[iPos], nSpace
23440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23460 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30       assert( n>0
23470 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
23480 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
23490 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
234a0 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f  f, &pPoslist[iPo
234b0 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  s], n);.        
234c0 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20          iPos += 
234d0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
234e0 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
234f0 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67  + pPgidx->n)>=pg
23500 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
23510 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
23520 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
23530 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
23540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
23560 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
23570 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
23580 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
23590 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
235a0 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  f += nCopy;.    
235b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
235c0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
235d0 20 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69   /* TODO2: Docli
235e0 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72  st terminator wr
235f0 69 74 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  itten here. */. 
23600 20 20 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b       /* pBuf->p[
23610 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30  pBuf->n++] = '\0
23620 27 3b 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  '; */.      asse
23630 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
23640 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20  f->nSpace );.   
23650 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
23660 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68  shScanNext(pHash
23670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
23680 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
23690 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74  r(pHash);.    ft
236a0 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
236b0 20 26 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c   &writer, &pgnoL
236c0 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ast);..    /* Up
236d0 64 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72  date the Fts5Str
236e0 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72  ucture. It is wr
236f0 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
23700 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68  e database by th
23710 65 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72  e.    ** fts5Str
23720 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20  uctureRelease() 
23730 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  call below.  */.
23740 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d      if( pStruct-
23750 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20  >nLevel==0 ){.  
23760 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
23770 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
23780 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , &pStruct);.   
23790 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
237a0 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
237b0 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
237c0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
237d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
237e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65  _OK ){.      pSe
237f0 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
23800 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53  evel[0].aSeg[ pS
23810 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
23820 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20  .nSeg++ ];.     
23830 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
23840 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53  iSegid;.      pS
23850 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
23860 31 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  1;.      pSeg->p
23870 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61  gnoLast = pgnoLa
23880 73 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  st;.      pStruc
23890 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20  t->nSegment++;. 
238a0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
238b0 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c  ucturePromote(p,
238c0 20 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20   0, pStruct);.  
238d0 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75  }..  fts5IndexAu
238e0 74 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72  tomerge(p, &pStr
238f0 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a  uct, pgnoLast);.
23900 20 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69    fts5IndexCrisi
23910 73 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  smerge(p, &pStru
23920 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
23930 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74  tureWrite(p, pSt
23940 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
23950 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
23960 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  truct);.}../*.**
23970 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
23980 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
23990 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
239a0 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  les to the datab
239b0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ase..*/.static v
239c0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75  oid fts5IndexFlu
239d0 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  sh(Fts5Index *p)
239e0 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74  {.  /* Unless it
239f0 20 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68   is empty, flush
23a00 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
23a10 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28  to disk */.  if(
23a20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
23a30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23a40 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20  p->pHash );.    
23a50 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
23a60 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75  = 0;.    fts5Flu
23a70 73 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20  shOneHash(p);.  
23a80 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  }.}..static Fts5
23a90 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 49  Structure *fts5I
23aa0 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75  ndexOptimizeStru
23ab0 63 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ct(.  Fts5Index 
23ac0 2a 70 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  *p, .  Fts5Struc
23ad0 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b  ture *pStruct.){
23ae0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
23af0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e   *pNew = 0;.  in
23b00 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
23b10 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 3b  (Fts5Structure);
23b20 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53  .  int nSeg = pS
23b30 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
23b40 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
23b50 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68  Figure out if th
23b60 69 73 20 73 74 72 75 63 74 75 72 65 20 72 65 71  is structure req
23b70 75 69 72 65 73 20 6f 70 74 69 6d 69 7a 61 74 69  uires optimizati
23b80 6f 6e 2e 20 41 20 73 74 72 75 63 74 75 72 65 20  on. A structure 
23b90 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  does.  ** not re
23ba0 71 75 69 72 65 20 6f 70 74 69 6d 69 7a 61 74 69  quire optimizati
23bb0 6f 6e 20 69 66 20 65 69 74 68 65 72 3a 0a 20 20  on if either:.  
23bc0 2a 2a 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f  **.  **  + it co
23bd0 6e 73 69 73 74 73 20 6f 66 20 66 65 77 65 72 20  nsists of fewer 
23be0 74 68 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74  than two segment
23bf0 73 2c 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61  s, or .  **  + a
23c00 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20  ll segments are 
23c10 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65  on the same leve
23c20 6c 2c 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c  l, or.  **  + al
23c30 6c 20 73 65 67 6d 65 6e 74 73 20 65 78 63 65 70  l segments excep
23c40 74 20 6f 6e 65 20 61 72 65 20 63 75 72 72 65 6e  t one are curren
23c50 74 6c 79 20 69 6e 70 75 74 73 20 74 6f 20 61 20  tly inputs to a 
23c60 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e  merge operation.
23c70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68  .  **.  ** In th
23c80 65 20 66 69 72 73 74 20 63 61 73 65 2c 20 72 65  e first case, re
23c90 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68  turn NULL. In th
23ca0 65 20 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d  e second, increm
23cb0 65 6e 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e  ent the ref-coun
23cc0 74 0a 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75  t.  ** on *pStru
23cd0 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ct and return a 
23ce0 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  copy of the poin
23cf0 74 65 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  ter to it..  */.
23d00 20 20 69 66 28 20 6e 53 65 67 3c 32 20 29 20 72    if( nSeg<2 ) r
23d10 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
23d20 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e  =0; i<pStruct->n
23d30 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
23d40 20 69 6e 74 20 6e 54 68 69 73 20 3d 20 70 53 74   int nThis = pSt
23d50 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
23d60 6e 53 65 67 3b 0a 20 20 20 20 69 66 28 20 6e 54  nSeg;.    if( nT
23d70 68 69 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54  his==nSeg || (nT
23d80 68 69 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70  his==nSeg-1 && p
23d90 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
23da0 5d 2e 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29  ].nMerge==nThis)
23db0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
23dc0 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72 75  ructureRef(pStru
23dd0 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ct);.      retur
23de0 6e 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  n pStruct;.    }
23df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
23e00 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
23e10 6e 4d 65 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b  nMerge<=nThis );
23e20 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d  .  }..  nByte +=
23e30 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65   (pStruct->nLeve
23e40 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  l+1) * sizeof(Ft
23e50 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
23e60 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73  );.  pNew = (Fts
23e70 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
23e80 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
23e90 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
23ea0 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
23eb0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
23ec0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
23ed0 20 20 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20     nByte = nSeg 
23ee0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
23ef0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
23f00 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c      pNew->nLevel
23f10 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
23f20 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  el+1;.    pNew->
23f30 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e  nRef = 1;.    pN
23f40 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ew->nWriteCounte
23f50 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72  r = pStruct->nWr
23f60 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20  iteCounter;.    
23f70 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c  pLvl = &pNew->aL
23f80 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c  evel[pStruct->nL
23f90 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d  evel];.    pLvl-
23fa0 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72  >aSeg = (Fts5Str
23fb0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73  uctureSegment*)s
23fc0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
23fd0 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
23fe0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  te);.    if( pLv
23ff0 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20  l->aSeg ){.     
24000 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
24010 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f  .      int iSegO
24020 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a  ut = 0;.      /*
24030 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
24040 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66   all segments, f
24050 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65  rom oldest to ne
24060 77 65 73 74 2e 20 41 64 64 20 74 68 65 6d 20 74  west. Add them t
24070 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  o.      ** the n
24080 65 77 20 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a  ew Fts5Level obj
24090 65 63 74 20 73 6f 20 74 68 61 74 20 70 4c 76 6c  ect so that pLvl
240a0 2d 3e 61 53 65 67 5b 30 5d 20 69 73 20 74 68 65  ->aSeg[0] is the
240b0 20 6f 6c 64 65 73 74 0a 20 20 20 20 20 20 2a 2a   oldest.      **
240c0 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20   segment in the 
240d0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
240e0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 4c   */.      for(iL
240f0 76 6c 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl=pStruct->nLev
24100 65 6c 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69  el-1; iLvl>=0; i
24110 4c 76 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Lvl--){.        
24120 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
24130 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
24140 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
24150 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
24160 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f  pLvl->aSeg[iSegO
24170 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  ut] = pStruct->a
24180 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
24190 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
241a0 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20    iSegOut++;.   
241b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
241c0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d       pNew->nSegm
241d0 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  ent = pLvl->nSeg
241e0 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c   = nSeg;.    }el
241f0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24200 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
24210 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
24220 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
24230 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73  n pNew;.}..int s
24240 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
24250 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65  ptimize(Fts5Inde
24260 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
24270 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
24280 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
24290 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61   *pNew = 0;..  a
242a0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
242b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
242c0 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
242d0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
242e0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
242f0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
24300 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
24310 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
24320 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  {.    pNew = fts
24330 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74  5IndexOptimizeSt
24340 72 75 63 74 28 70 2c 20 70 53 74 72 75 63 74 29  ruct(p, pStruct)
24350 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75  ;.  }.  fts5Stru
24360 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
24370 72 75 63 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  ruct);..  assert
24380 28 20 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65  ( pNew==0 || pNe
24390 77 2d 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b  w->nSegment>0 );
243a0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
243b0 20 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20     int iLvl;.   
243c0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65   for(iLvl=0; pNe
243d0 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
243e0 6e 53 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29  nSeg==0; iLvl++)
243f0 7b 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  {}.    while( p-
24400 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
24410 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  & pNew->aLevel[i
24420 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20  Lvl].nSeg>0 ){. 
24430 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
24440 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
24450 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  IT;.      fts5In
24460 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
24470 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e   &pNew, iLvl, &n
24480 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Rem);.    }..   
24490 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
244a0 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ite(p, pNew);.  
244b0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
244c0 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
244d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  }..  return fts5
244e0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20  IndexReturn(p); 
244f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
24500 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c  s called to impl
24510 65 6d 65 6e 74 20 74 68 65 20 73 70 65 63 69 61  ement the specia
24520 6c 20 22 56 41 4c 55 45 53 28 27 6d 65 72 67 65  l "VALUES('merge
24530 27 2c 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20  ', $nMerge)".** 
24540 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a  INSERT command..
24550 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
24560 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73  s5IndexMerge(Fts
24570 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e  5Index *p, int n
24580 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74  Merge){.  Fts5St
24590 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
245a0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
245b0 52 65 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70  Read(p);.  if( p
245c0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
245d0 74 20 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e  t nMin = p->pCon
245e0 66 69 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b  fig->nUsermerge;
245f0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
24600 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b  reInvalidate(p);
24610 0a 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3c  .    if( nMerge<
24620 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  0 ){.      Fts5S
24630 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d  tructure *pNew =
24640 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69   fts5IndexOptimi
24650 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74 72  zeStruct(p, pStr
24660 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  uct);.      fts5
24670 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
24680 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20  (pStruct);.     
24690 20 70 53 74 72 75 63 74 20 3d 20 70 4e 65 77 3b   pStruct = pNew;
246a0 0a 20 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b  .      nMin = 2;
246b0 0a 20 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20  .      nMerge = 
246c0 6e 4d 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d  nMerge*-1;.    }
246d0 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
246e0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
246f0 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  vel ){.      if(
24700 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
24710 70 2c 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65  p, &pStruct, nMe
24720 72 67 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20  rge, nMin) ){.  
24730 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
24740 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72  ureWrite(p, pStr
24750 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uct);.      }.  
24760 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
24770 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
24780 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ruct);.  }.  ret
24790 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
247a0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(p);.}..stati
247b0 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e  c void fts5Appen
247c0 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
247d0 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44  dex *p,.  i64 iD
247e0 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72  elta,.  Fts5Iter
247f0 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73   *pUnused,.  Fts
24800 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
24810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
24820 70 55 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35  pUnused);.  fts5
24830 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
24840 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  nt(&p->rc, pBuf,
24850 20 69 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61   iDelta);.}..sta
24860 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 70  tic void fts5App
24870 65 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  endPoslist(.  Ft
24880 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36  s5Index *p,.  i6
24890 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35  4 iDelta,.  Fts5
248a0 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20  Iter *pMulti,.  
248b0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
248c0 0a 29 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20  .){.  int nData 
248d0 3d 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e  = pMulti->base.n
248e0 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
248f0 6e 44 61 74 61 3e 30 20 29 3b 0a 20 20 69 66 28  nData>0 );.  if(
24900 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
24910 4b 20 26 26 20 30 3d 3d 66 74 73 35 42 75 66 66  K && 0==fts5Buff
24920 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
24930 42 75 66 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20  Buf, nData+9+9) 
24940 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
24950 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
24960 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  t(pBuf, iDelta);
24970 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
24980 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
24990 70 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a  pBuf, nData*2);.
249a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
249b0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
249c0 66 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e  f, pMulti->base.
249d0 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
249e0 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f   }.}...static vo
249f0 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
24a00 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69  erNext(Fts5Docli
24a10 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  stIter *pIter){.
24a20 20 20 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d    u8 *p = pIter-
24a30 3e 61 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65  >aPoslist + pIte
24a40 72 2d 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72  r->nSize + pIter
24a50 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61  ->nPoslist;..  a
24a60 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50  ssert( pIter->aP
24a70 6f 73 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  oslist );.  if( 
24a80 70 3e 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29  p>=pIter->aEof )
24a90 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  {.    pIter->aPo
24aa0 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  slist = 0;.  }el
24ab0 73 65 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c  se{.    i64 iDel
24ac0 74 61 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74  ta;..    p += ft
24ad0 73 35 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28  s5GetVarint(p, (
24ae0 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
24af0 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
24b00 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20   += iDelta;..   
24b10 20 2f 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f   /* Read positio
24b20 6e 20 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20  n list size */. 
24b30 20 20 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78     if( p[0] & 0x
24b40 38 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  80 ){.      int 
24b50 6e 50 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65  nPos;.      pIte
24b60 72 2d 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47  r->nSize = fts5G
24b70 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50  etVarint32(p, nP
24b80 6f 73 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  os);.      pIter
24b90 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50  ->nPoslist = (nP
24ba0 6f 73 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73  os>>1);.    }els
24bb0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
24bc0 6e 50 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74  nPoslist = ((int
24bd0 29 28 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20  )(p[0])) >> 1;. 
24be0 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a       pIter->nSiz
24bf0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 1;.    }..  
24c00 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
24c10 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  t = p;.  }.}..st
24c20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
24c30 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20  clistIterInit(. 
24c40 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24c50 66 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73  f, .  Fts5Doclis
24c60 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a  tIter *pIter.){.
24c70 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
24c80 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
24c90 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f  ));.  pIter->aPo
24ca0 73 6c 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b  slist = pBuf->p;
24cb0 0a 20 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d  .  pIter->aEof =
24cc0 20 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e   &pBuf->p[pBuf->
24cd0 6e 5d 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73  n];.  fts5Doclis
24ce0 74 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29  tIterNext(pIter)
24cf0 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
24d00 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73   Append a doclis
24d10 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  t to buffer pBuf
24d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
24d30 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
24d40 61 74 20 73 70 61 63 65 20 77 69 74 68 69 6e 20  at space within 
24d50 74 68 65 20 62 75 66 66 65 72 20 68 61 73 20 61  the buffer has a
24d60 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61  lready been.** a
24d70 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  llocated..*/.sta
24d80 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
24d90 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20  geAppendDocid(. 
24da0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24db0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
24dc0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72   /* Buffer to wr
24dd0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
24de0 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20  *piLastRowid,   
24df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24e00 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20  N/OUT: Previous 
24e10 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69  rowid written (i
24e20 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20  f any) */.  i64 
24e30 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  iRowid          
24e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24e50 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a  owid to append *
24e60 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
24e70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70  Buf->n!=0 || (*p
24e80 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29  iLastRowid)==0 )
24e90 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61  ;.  fts5BufferSa
24ea0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
24eb0 42 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70  Buf, iRowid - *p
24ec0 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a  iLastRowid);.  *
24ed0 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52  piLastRowid = iR
24ee0 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  owid;.}.#endif..
24ef0 23 64 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67  #define fts5Merg
24f00 65 41 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75  eAppendDocid(pBu
24f10 66 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  f, iLastRowid, i
24f20 52 6f 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c  Rowid) {       \
24f30 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66  .  assert( (pBuf
24f40 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73  )->n!=0 || (iLas
24f50 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20  tRowid)==0 );   
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f70 5c 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61  \.  fts5BufferSa
24f80 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28  feAppendVarint((
24f90 70 42 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20  pBuf), (iRowid) 
24fa0 2d 20 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b  - (iLastRowid));
24fb0 20 5c 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64   \.  (iLastRowid
24fc0 29 20 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20  ) = (iRowid);   
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61    \.}../*.** Swa
25000 70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  p the contents o
25010 66 20 62 75 66 66 65 72 20 2a 70 31 20 77 69 74  f buffer *p1 wit
25020 68 20 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a  h that of *p2..*
25030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25040 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73  s5BufferSwap(Fts
25050 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73  5Buffer *p1, Fts
25060 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20  5Buffer *p2){.  
25070 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d  Fts5Buffer tmp =
25080 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70   *p1;.  *p1 = *p
25090 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a  2;.  *p2 = tmp;.
250a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
250b0 74 73 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73  ts5NextRowid(Fts
250c0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
250d0 6e 74 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a  nt *piOff, i64 *
250e0 70 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20  piRowid){.  int 
250f0 69 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66  i = *piOff;.  if
25100 28 20 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a  ( i>=pBuf->n ){.
25110 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b      *piOff = -1;
25120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36  .  }else{.    u6
25130 34 20 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f  4 iVal;.    *piO
25140 66 66 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33  ff = i + sqlite3
25150 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
25160 42 75 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c  Buf->p[i], &iVal
25170 29 3b 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20  );.    *piRowid 
25180 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  += iVal;.  }.}..
25190 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
251a0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
251b0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
251c0 69 73 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ists() for detai
251d0 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20  l=none mode..** 
251e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
251f0 20 62 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74   buffers consist
25200 20 6f 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f   of a delta-enco
25210 64 65 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69  ded list of rowi
25220 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ds only..*/.stat
25230 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
25240 65 52 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46  eRowidLists(.  F
25250 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25270 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
25280 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42  bject */.  Fts5B
25290 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20  uffer *p1,      
252a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
252b0 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  rst list to merg
252c0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
252d0 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20  r *p2           
252e0 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
252f0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
25300 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  /.){.  int i1 = 
25310 30 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b  0;.  int i2 = 0;
25320 0a 20 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d  .  i64 iRowid1 =
25330 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
25340 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75  2 = 0;.  i64 iOu
25350 74 20 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75  t = 0;..  Fts5Bu
25360 66 66 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73  ffer out;.  mems
25370 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
25380 6f 66 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69  of(out));.  sqli
25390 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
253a0 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  e(&p->rc, &out, 
253b0 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a  p1->n + p2->n);.
253c0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
253d0 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78  turn;..  fts5Nex
253e0 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20  tRowid(p1, &i1, 
253f0 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73  &iRowid1);.  fts
25400 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26  5NextRowid(p2, &
25410 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20  i2, &iRowid2);. 
25420 20 77 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c   while( i1>=0 ||
25430 20 69 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66   i2>=0 ){.    if
25440 28 20 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30  ( i1>=0 && (i2<0
25450 20 7c 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77   || iRowid1<iRow
25460 69 64 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73  id2) ){.      as
25470 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c  sert( iOut==0 ||
25480 20 69 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b   iRowid1>iOut );
25490 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
254a0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
254b0 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20  t(&out, iRowid1 
254c0 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  - iOut);.      i
254d0 4f 75 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20  Out = iRowid1;. 
254e0 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
254f0 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f  id(p1, &i1, &iRo
25500 77 69 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  wid1);.    }else
25510 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25520 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69  iOut==0 || iRowi
25530 64 32 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20  d2>iOut );.     
25540 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25550 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
25560 2c 20 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74  , iRowid2 - iOut
25570 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20  );.      iOut = 
25580 69 52 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69  iRowid2;.      i
25590 66 28 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77  f( i1>=0 && iRow
255a0 69 64 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a  id1==iRowid2 ){.
255b0 20 20 20 20 20 20 20 20 66 74 73 35 4e 65 78 74          fts5Next
255c0 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26  Rowid(p1, &i1, &
255d0 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20  iRowid1);.      
255e0 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78 74  }.      fts5Next
255f0 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26  Rowid(p2, &i2, &
25600 69 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a  iRowid2);.    }.
25610 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65    }..  fts5Buffe
25620 72 53 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b  rSwap(&out, p1);
25630 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
25640 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(&out);.}../*.*
25650 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64  * Buffers p1 and
25660 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c   p2 contain docl
25670 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ists. This funct
25680 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63  ion merges the c
25690 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65  ontent.** of the
256a0 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f   two doclists to
256b0 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20  gether and sets 
256c0 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65  buffer p1 to the
256d0 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a   result before.*
256e0 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  * returning..**.
256f0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
25700 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
25710 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
25720 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  p->rc. If an err
25730 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  or has.** alread
25740 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
25750 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
25760 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
25770 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72  void fts5MergePr
25780 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73  efixLists(.  Fts
25790 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257b0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
257c0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
257d0 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
257e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
257f0 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
25800 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
25810 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
25820 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
25830 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
25840 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29  ){.  if( p2->n )
25850 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  {.    i64 iLastR
25860 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
25870 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31  s5DoclistIter i1
25880 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
25890 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74  tIter i2;.    Ft
258a0 73 35 42 75 66 66 65 72 20 6f 75 74 20 3d 20 7b  s5Buffer out = {
258b0 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74  0, 0, 0};.    Ft
258c0 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 7b  s5Buffer tmp = {
258d0 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 2f  0, 0, 0};..    /
258e0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  * The maximum si
258f0 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ze of the output
25900 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
25910 20 73 75 6d 20 6f 66 20 74 68 65 20 74 77 6f 20   sum of the two 
25920 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 73 69  .    ** input si
25930 7a 65 73 20 2b 20 31 20 76 61 72 69 6e 74 20 28  zes + 1 varint (
25940 39 20 62 79 74 65 73 29 2e 20 54 68 65 20 65 78  9 bytes). The ex
25950 74 72 61 20 76 61 72 69 6e 74 20 69 73 20 62 65  tra varint is be
25960 63 61 75 73 65 20 69 66 20 74 68 65 0a 20 20 20  cause if the.   
25970 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   ** first rowid 
25980 69 6e 20 6f 6e 65 20 69 6e 70 75 74 20 69 73 20  in one input is 
25990 61 20 6c 61 72 67 65 20 6e 65 67 61 74 69 76 65  a large negative
259a0 20 6e 75 6d 62 65 72 2c 20 61 6e 64 20 74 68 65   number, and the
259b0 20 66 69 72 73 74 20 69 6e 0a 20 20 20 20 2a 2a   first in.    **
259c0 20 74 68 65 20 6f 74 68 65 72 20 61 20 6e 6f 6e   the other a non
259d0 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72  -negative number
259e0 2c 20 74 68 65 20 64 65 6c 74 61 20 66 6f 72 20  , the delta for 
259f0 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
25a00 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 77  .    ** number w
25a10 69 6c 6c 20 62 65 20 6c 61 72 67 65 72 20 6f 6e  ill be larger on
25a20 20 64 69 73 6b 20 74 68 61 6e 20 74 68 65 20 6c   disk than the l
25a30 69 74 65 72 61 6c 20 69 6e 74 65 67 65 72 20 76  iteral integer v
25a40 61 6c 75 65 0a 20 20 20 20 2a 2a 20 77 61 73 2e  alue.    ** was.
25a50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
25a60 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
25a70 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ze(&p->rc, &out,
25a80 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20 2b   p1->n + p2->n +
25a90 20 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   9) ) return;.  
25aa0 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25ab0 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a  rInit(p1, &i1);.
25ac0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
25ad0 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29  terInit(p2, &i2)
25ae0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  ;..    while( 1 
25af0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e  ){.      if( i1.
25b00 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64  iRowid<i2.iRowid
25b10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
25b20 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
25b30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  1 */.        fts
25b40 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
25b50 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
25b60 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a  id, i1.iRowid);.
25b70 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
25b80 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
25b90 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69  (&out, i1.aPosli
25ba0 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b  st, i1.nPoslist+
25bb0 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  i1.nSize);.     
25bc0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
25bd0 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
25be0 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73       if( i1.aPos
25bf0 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  list==0 ) break;
25c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
25c10 6c 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69  lse if( i2.iRowi
25c20 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a  d!=i1.iRowid ){.
25c30 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
25c40 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f  entry from i2 */
25c50 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
25c60 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
25c70 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
25c80 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
25c90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
25ca0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
25cb0 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i2.aPoslist, 
25cc0 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e  i2.nPoslist+i2.n
25cd0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66  Size);.        f
25ce0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
25cf0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20  xt(&i2);.       
25d00 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74   if( i2.aPoslist
25d10 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
25d20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
25d30 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  .        /* Merg
25d40 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69  e the two positi
25d50 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20  on lists. */ .  
25d60 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20        i64 iPos1 
25d70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
25d80 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20   iPos2 = 0;.    
25d90 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20      int iOff1 = 
25da0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
25db0 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  Off2 = 0;.      
25dc0 20 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61    u8 *a1 = &i1.a
25dd0 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65  Poslist[i1.nSize
25de0 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ];.        u8 *a
25df0 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74  2 = &i2.aPoslist
25e00 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20  [i2.nSize];..   
25e10 20 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d       i64 iPrev =
25e20 20 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35   0;.        Fts5
25e30 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
25e40 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65  iter;.        me
25e50 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
25e60 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29   sizeof(writer))
25e70 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ;..        fts5M
25e80 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
25e90 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
25ea0 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
25eb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
25ec0 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20  Zero(&tmp);.    
25ed0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
25ee0 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
25ef0 2c 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c  , &tmp, i1.nPosl
25f00 69 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73  ist + i2.nPoslis
25f10 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
25f20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
25f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25f40 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
25f50 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  (a1, i1.nPoslist
25f60 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31  , &iOff1, &iPos1
25f70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25f80 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
25f90 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
25fa0 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
25fb0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  os2);.        as
25fc0 73 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26  sert( iPos1>=0 &
25fd0 26 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20  & iPos2>=0 );.. 
25fe0 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
25ff0 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20  <iPos2 ){.      
26000 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26010 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
26020 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
26030 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
26040 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26050 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
26060 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
26070 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
26080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26090 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
260a0 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
260b0 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
260c0 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
260d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
260e0 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69  listNext64(a2, i
260f0 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  2.nPoslist, &iOf
26100 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20  f2, &iPos2);.   
26110 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26120 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20  if( iPos1>=0 && 
26130 69 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20  iPos2>=0 ){.    
26140 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
26150 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
26160 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b  ( iPos1<iPos2 ){
26170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26180 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20  f( iPos1!=iPrev 
26190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
261a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
261b0 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
261c0 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
261d0 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
261e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
261f0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26200 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c  oslistNext64(a1,
26210 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i1.nPoslist, &i
26220 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20  Off1, &iPos1);. 
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26240 20 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b   iPos1<0 ) break
26250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
26260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26270 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 32     assert( iPos2
26280 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20  !=iPrev );.     
26290 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
262a0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
262b0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
262c0 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20  ev, iPos2);.    
262d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
262e0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
262f0 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69  64(a2, i2.nPosli
26300 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f  st, &iOff2, &iPo
26310 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s2);.           
26320 20 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29     if( iPos2<0 )
26330 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26350 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
26360 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d       if( iPos1>=
26370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
26380 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20  f( iPos1!=iPrev 
26390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
263a0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
263b0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
263c0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29  , &iPrev, iPos1)
263d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
263e0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
263f0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26400 28 26 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31  (&tmp, &a1[iOff1
26410 5d 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69  ], i1.nPoslist-i
26420 4f 66 66 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  Off1);.        }
26430 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26440 61 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30  assert( iPos2>=0
26450 20 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76   && iPos2!=iPrev
26460 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
26470 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26480 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
26490 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b   &iPrev, iPos2);
264a0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
264b0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
264c0 6c 6f 62 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f  lob(&tmp, &a2[iO
264d0 66 66 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  ff2], i2.nPoslis
264e0 74 2d 69 4f 66 66 32 29 3b 0a 20 20 20 20 20 20  t-iOff2);.      
264f0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
26500 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
26510 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
26520 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
26530 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70  Varint(&out, tmp
26540 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  .n * 2);.       
26550 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
26560 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
26570 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20  tmp.p, tmp.n);. 
26580 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
26590 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b  stIterNext(&i1);
265a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
265b0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
265c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
265d0 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  1.aPoslist==0 ||
265e0 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i2.aPoslist==0 
265f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
26600 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26610 69 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20  i1.aPoslist ){. 
26620 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
26630 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
26640 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69  iLastRowid, i1.i
26650 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74  Rowid);.      ft
26660 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
26670 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e  ndBlob(&out, i1.
26680 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f  aPoslist, i1.aEo
26690 66 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29  f - i1.aPoslist)
266a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
266b0 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74   if( i2.aPoslist
266c0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65   ){.      fts5Me
266d0 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
266e0 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
266f0 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
26700 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
26710 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
26720 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i2.aPoslist, i
26730 32 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73  2.aEof - i2.aPos
26740 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  list);.    }.   
26750 20 61 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d   assert( out.n<=
26760 28 70 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20  (p1->n+p2->n+9) 
26770 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  );..    fts5Buff
26780 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
26790 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
267a0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
267b0 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
267c0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
267d0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
267e0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75  ic void fts5Setu
267f0 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46  pPrefixIter(.  F
26800 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26820 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20  * Index to read 
26830 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44  from */.  int bD
26840 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  esc,            
26850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26860 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20  e for "ORDER BY 
26870 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
26880 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
26890 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
268a0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
268b0 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
268c0 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
268d0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
268e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
268f0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
26900 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
26910 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
26920 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
26930 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
26940 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63  tches to these c
26950 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35  olumns */.  Fts5
26960 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
26970 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
26980 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29  ew iterator */.)
26990 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
269a0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
269b0 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a  s5Buffer *aBuf;.
269c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66    const int nBuf
269d0 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28   = 32;..  void (
269e0 2a 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64  *xMerge)(Fts5Ind
269f0 65 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  ex*, Fts5Buffer*
26a00 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a  , Fts5Buffer*);.
26a10 20 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64    void (*xAppend
26a20 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36  )(Fts5Index*, i6
26a30 34 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74  4, Fts5Iter*, Ft
26a40 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66  s5Buffer*);.  if
26a50 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
26a60 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
26a70 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78  IL_NONE ){.    x
26a80 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67  Merge = fts5Merg
26a90 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20  eRowidLists;.   
26aa0 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
26ab0 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65  ppendRowid;.  }e
26ac0 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20  lse{.    xMerge 
26ad0 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  = fts5MergePrefi
26ae0 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70  xLists;.    xApp
26af0 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64  end = fts5Append
26b00 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Poslist;.  }..  
26b10 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66  aBuf = (Fts5Buff
26b20 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
26b30 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
26b40 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20  Buffer)*nBuf);. 
26b50 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
26b60 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
26b70 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
26b80 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63  pStruct ){.    c
26b90 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
26ba0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
26bb0 5f 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20  _SCAN .         
26bc0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53             | FTS
26bd0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49  5INDEX_QUERY_SKI
26be0 50 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20  PEMPTY .        
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54              | FT
26c00 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
26c10 4f 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20  OUTPUT;.    int 
26c20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74  i;.    i64 iLast
26c30 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46  Rowid = 0;.    F
26c40 74 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b  ts5Iter *p1 = 0;
26c50 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
26c60 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20   used to gather 
26c70 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20  data from index 
26c80 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  */.    Fts5Data 
26c90 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35  *pData;.    Fts5
26ca0 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a  Buffer doclist;.
26cb0 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
26cc0 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = 1;..    memse
26cd0 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73  t(&doclist, 0, s
26ce0 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b  izeof(doclist));
26cf0 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
26d00 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
26d10 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74  , flags, pColset
26d20 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
26d30 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20  , -1, 0, &p1);. 
26d40 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
26d50 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70  tputCb(&p->rc, p
26d60 31 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20  1);.    for( /* 
26d70 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20  no-op */ ;.     
26d80 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
26d90 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20  Eof(p, p1)==0;. 
26da0 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
26db0 49 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c  IterNext2(p, p1,
26dc0 20 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20   &bNewTerm).    
26dd0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
26de0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31  Iter *pSeg = &p1
26df0 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72  ->aSeg[ p1->aFir
26e00 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
26e10 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20        int nTerm 
26e20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a  = pSeg->term.n;.
26e30 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
26e40 70 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65  pTerm = pSeg->te
26e50 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e  rm.p;.      p1->
26e60 78 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20  xSetOutputs(p1, 
26e70 70 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73  pSeg);..      as
26e80 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28  sert_nc( memcmp(
26e90 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d  pToken, pTerm, M
26ea0 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d  IN(nToken, nTerm
26eb0 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))<=0 );.      i
26ec0 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  f( bNewTerm ){. 
26ed0 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d         if( nTerm
26ee0 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d  <nToken || memcm
26ef0 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
26f00 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b   nToken) ) break
26f10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26f20 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44   if( p1->base.nD
26f30 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ata==0 ) continu
26f40 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31  e;..      if( p1
26f50 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69  ->base.iRowid<=i
26f60 4c 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63  LastRowid && doc
26f70 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  list.n>0 ){.    
26f80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e      for(i=0; p->
26f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26fa0 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29   doclist.n; i++)
26fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
26fc0 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20  rt( i<nBuf );.  
26fd0 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66          if( aBuf
26fe0 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  [i].n==0 ){.    
26ff0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
27000 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c  erSwap(&doclist,
27010 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
27020 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
27030 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29  erZero(&doclist)
27040 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
27050 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  e{.            x
27060 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73  Merge(p, &doclis
27070 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
27080 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
27090 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69  fferZero(&aBuf[i
270a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
270b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
270c0 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30    iLastRowid = 0
270d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
270e0 20 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e   xAppend(p, p1->
270f0 62 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73  base.iRowid-iLas
27100 74 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63  tRowid, p1, &doc
27110 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61  list);.      iLa
27120 73 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61  stRowid = p1->ba
27130 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d  se.iRowid;.    }
27140 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
27150 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nBuf; i++){.   
27160 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
27170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27180 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f     xMerge(p, &do
27190 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
271a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
271b0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
271c0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
271d0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
271e0 72 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20  rFree(p1);..    
271f0 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d  pData = fts5IdxM
27200 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
27210 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c  Fts5Data) + docl
27220 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20  ist.n);.    if( 
27230 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70  pData ){.      p
27240 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26  Data->p = (u8*)&
27250 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20  pData[1];.      
27260 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74  pData->nn = pDat
27270 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c  a->szLeaf = docl
27280 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  ist.n;.      if(
27290 20 64 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d   doclist.n ) mem
272a0 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f  cpy(pData->p, do
272b0 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74  clist.p, doclist
272c0 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  .n);.      fts5M
272d0 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20  ultiIterNew2(p, 
272e0 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70  pData, bDesc, pp
272f0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
27300 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
27310 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a  &doclist);.  }..
27320 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
27330 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
27340 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27350 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  aBuf);.}.../*.**
27360 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
27370 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ll subsequent ca
27380 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
27390 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
273a0 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65  ertain.** to the
273b0 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
273c0 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a  owid iRowid..*/.
273d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
273e0 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46  ndexBeginWrite(F
273f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
27400 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52   bDelete, i64 iR
27410 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28  owid){.  assert(
27420 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27430 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  K );..  /* Alloc
27440 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ate the hash tab
27450 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  le if it has not
27460 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
27470 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28  located */.  if(
27480 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a   p->pHash==0 ){.
27490 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
274a0 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 70  te3Fts5HashNew(p
274b0 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70  ->pConfig, &p->p
274c0 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69  Hash, &p->nPendi
274d0 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ngData);.  }..  
274e0 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61 73  /* Flush the has
274f0 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20  h table to disk 
27500 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
27510 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69   if( iRowid<p->i
27520 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c  WriteRowid .   |
27530 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57  | (iRowid==p->iW
27540 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e  riteRowid && p->
27550 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c  bDelete==0).   |
27560 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  | (p->nPendingDa
27570 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ta > p->pConfig-
27580 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29  >nHashSize) .  )
27590 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46  {.    fts5IndexF
275a0 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  lush(p);.  }..  
275b0 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
275c0 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44   iRowid;.  p->bD
275d0 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b  elete = bDelete;
275e0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
275f0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
27600 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61  ./*.** Commit da
27610 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  ta to disk..*/.i
27620 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27630 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65  dexSync(Fts5Inde
27640 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
27650 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27660 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
27670 46 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35  Flush(p);.  fts5
27680 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
27690 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
276a0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
276b0 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e  /*.** Discard an
276c0 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
276d0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
276e0 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e  ash tables. Do n
276f0 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74  ot write it.** t
27700 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
27710 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73  Additionally, as
27720 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f  sume that the co
27730 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f  ntents of the %_
27740 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61  data.** table ma
27750 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f  y have changed o
27760 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69  n disk. So any i
27770 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20  n-memory caches 
27780 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65  of %_data .** re
27790 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e  cords must be in
277a0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e  validated..*/.in
277b0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
277c0 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
277d0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35  ndex *p){.  fts5
277e0 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
277f0 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61    fts5IndexDisca
27800 72 64 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73  rdData(p);.  fts
27810 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
27820 64 61 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73  date(p);.  /* as
27830 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
27840 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72  ITE_OK ); */.  r
27850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f  .}../*.** The %_
27870 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f  data table is co
27880 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77  mpletely empty w
27890 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
278a0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69  n is called. Thi
278b0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f  s.** function po
278c0 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20  pulates it with 
278d0 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75  the initial stru
278e0 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f  cture objects fo
278f0 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a  r each index,.**
27900 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c   and the initial
27910 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
27920 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
27930 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62  d (a zero-byte b
27940 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lob)..*/.int sql
27950 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
27960 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nit(Fts5Index *p
27970 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
27980 72 65 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75  re s;.  fts5Stru
27990 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
279a0 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c  p);.  memset(&s,
279b0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
279c0 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74  tructure));.  ft
279d0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
279e0 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
279f0 49 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22  ID, (const u8*)"
27a00 22 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72  ", 0);.  fts5Str
27a10 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 26  uctureWrite(p, &
27a20 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  s);.  return fts
27a30 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
27a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
27a50 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20 68   new Fts5Index h
27a60 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43  andle. If the bC
27a70 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69  reate argument i
27a80 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a  s true, create.*
27a90 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
27aa0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
27ab0 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
27ac0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
27ad0 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  l, set *pp to po
27ae0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
27af0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
27b00 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
27b10 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
27b20 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65  p to NULL and re
27b30 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
27b40 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
27b50 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27b60 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f  exOpen(.  Fts5Co
27b70 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a  nfig *pConfig, .
27b80 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a    int bCreate, .
27b90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70    Fts5Index **pp
27ba0 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
27bb0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
27bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35  QLITE_OK;.  Fts5
27bd0 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
27be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27bf0 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  ew object */..  
27c00 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49  *pp = p = (Fts5I
27c10 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73  ndex*)sqlite3Fts
27c20 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
27c30 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65   sizeof(Fts5Inde
27c40 78 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x));.  if( rc==S
27c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27c60 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f  p->pConfig = pCo
27c70 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f  nfig;.    p->nWo
27c80 72 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f  rkUnit = FTS5_WO
27c90 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e  RK_UNIT;.    p->
27ca0 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74  zDataTbl = sqlit
27cb0 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72  e3Fts5Mprintf(&r
27cc0 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43  c, "%s_data", pC
27cd0 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  onfig->zName);. 
27ce0 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54     if( p->zDataT
27cf0 62 6c 20 26 26 20 62 43 72 65 61 74 65 20 29 7b  bl && bCreate ){
27d00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27d10 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
27d20 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 43  le(.          pC
27d30 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22  onfig, "data", "
27d40 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
27d50 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c  RY KEY, block BL
27d60 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20  OB", 0, pzErr.  
27d70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
27d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27d90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
27da0 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
27db0 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22  Table(pConfig, "
27dc0 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20  idx", .         
27dd0 20 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c     "segid, term,
27de0 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b   pgno, PRIMARY K
27df0 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22  EY(segid, term)"
27e00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 31  , .            1
27e10 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20  , pzErr.        
27e20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27e40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
27e50 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
27e60 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20  dexReinit(p);.  
27e70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27e80 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
27e90 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
27ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
27eb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
27ec0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27ed0 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70  Close(p);.    *p
27ee0 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  p = 0;.  }.  ret
27ef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27f00 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   Close a handle 
27f10 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
27f20 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
27f30 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
27f40 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
27f50 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
27f60 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
27f70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27f80 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29  TE_OK;.  if( p )
27f90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
27fa0 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20  >pReader==0 );. 
27fb0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
27fc0 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
27fd0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
27fe0 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  ize(p->pWriter);
27ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
28000 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65  alize(p->pDelete
28010 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
28020 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
28030 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  Writer);.    sql
28040 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
28050 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
28060 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
28070 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  ize(p->pIdxSelec
28080 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
28090 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74  finalize(p->pDat
280a0 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73  aVersion);.    s
280b0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72  qlite3Fts5HashFr
280c0 65 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  ee(p->pHash);.  
280d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
280e0 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20  ->zDataTbl);.   
280f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
28100 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  c;.}../*.** Argu
28120 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f  ment p points to
28130 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
28140 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20  ning utf-8 text 
28150 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73 20  that is n bytes 
28160 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74  in .** size. Ret
28170 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
28180 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e  f bytes in the n
28190 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20 70  Char character p
281a0 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20  refix of the.** 
281b0 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20  buffer, or 0 if 
281c0 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74  there are less t
281d0 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63  han nChar charac
281e0 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a  ters in total..*
281f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
28200 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42  5IndexCharlenToB
28210 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20  ytelen(.  const 
28220 63 68 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20  char *p, .  int 
28230 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43  nByte, .  int nC
28240 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  har.){.  int n =
28250 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
28260 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b  or(i=0; i<nChar;
28270 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e   i++){.    if( n
28280 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e  >=nByte ) return
28290 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75   0;      /* Inpu
282a0 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  t contains fewer
282b0 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72   than nChar char
282c0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e  s */.    if( (un
282d0 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b  signed char)p[n+
282e0 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20  +]>=0xc0 ){.    
282f0 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26    while( (p[n] &
28300 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a   0xc0)==0x80 ){.
28310 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
28320 20 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74       if( n>=nByt
28330 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
28340 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
28350 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
28360 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38  * pIn is a UTF-8
28370 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c   encoded string,
28380 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69   nIn bytes in si
28390 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
283a0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63  umber of.** unic
283b0 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ode characters i
283c0 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  n the string..*/
283d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
283e0 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e  IndexCharlen(con
283f0 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e  st char *pIn, in
28400 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43  t nIn){.  int nC
28410 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  har = 0;        
28420 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30      .  int i = 0
28430 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e  ;.  while( i<nIn
28440 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73   ){.    if( (uns
28450 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69  igned char)pIn[i
28460 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
28470 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20     while( i<nIn 
28480 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63  && (pIn[i] & 0xc
28490 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a  0)==0x80 ) i++;.
284a0 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b      }.    nChar+
284b0 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
284c0 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nChar;.}../*.** 
284d0 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65  Insert or remove
284e0 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d   data to or from
284f0 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68   the index. Each
28500 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74   time a document
28510 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f   is .** added to
28520 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
28530 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73   the index, this
28540 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
28550 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  led one or more.
28560 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** times..**.** 
28570 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69  For an insert, i
28580 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
28590 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
285a0 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20  oken in the new 
285b0 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20  document..** If 
285c0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
285d0 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75   a delete, it mu
285e0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74  st be called (at
285f0 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72   least) once for
28600 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20   each.** unique 
28610 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63  token in the doc
28620 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43  ument with an iC
28630 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68  ol value less th
28640 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f  an zero. The iPo
28650 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  s.** argument is
28660 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64   ignored for a d
28670 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  elete..*/.int sq
28680 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72  lite3Fts5IndexWr
28690 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ite(.  Fts5Index
286a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
286b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
286c0 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
286d0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e   /* Column token
28700 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65   appears in (-ve
28710 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20   -> delete) */. 
28720 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20   int iPos,      
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
28750 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c  token within col
28760 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
28770 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74  har *pToken, int
28780 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65   nToken  /* Toke
28790 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f  n to add or remo
287a0 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e  ve to or from in
287b0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  dex */.){.  int 
287c0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
287d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
287e0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
287f0 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
28800 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
28810 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
28820 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
28830 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
28840 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
28850 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73  >pConfig;..  ass
28860 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
28870 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
28880 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e  t( (iCol<0)==p->
28890 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a  bDelete );..  /*
288a0 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
288b0 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  o the main terms
288c0 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20   index. */.  rc 
288d0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
288e0 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d  hWrite(.      p-
288f0 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74  >pHash, p->iWrit
28900 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
28910 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
28920 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  EFIX, pToken, nT
28930 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72  oken.  );..  for
28940 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
28950 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d  >nPrefix && rc==
28960 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
28970 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  .    const int n
28980 43 68 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e  Char = pConfig->
28990 61 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20  aPrefix[i];.    
289a0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  int nByte = sqli
289b0 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72  te3Fts5IndexChar
289c0 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f  lenToBytelen(pTo
289d0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68  ken, nToken, nCh
289e0 61 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  ar);.    if( nBy
289f0 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  te ){.      rc =
28a00 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
28a10 57 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20  Write(p->pHash, 
28a20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57  .          p->iW
28a30 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  riteRowid, iCol,
28a40 20 69 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54   iPos, (char)(FT
28a50 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69  S5_MAIN_PREFIX+i
28a60 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20  +1), pToken,.   
28a70 20 20 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20         nByte.   
28a80 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
28a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28aa0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
28ab0 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74  w iterator to it
28ac0 65 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c  erate though all
28ad0 20 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63   rowid that matc
28ae0 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66  h the .** specif
28af0 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b  ied token or tok
28b00 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e  en prefix..*/.in
28b10 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
28b20 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49  exQuery(.  Fts5I
28b30 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
28b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
28b50 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79  S index to query
28b60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28b70 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
28b80 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28  oken, /* Token (
28b90 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75  or prefix) to qu
28ba0 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ery for */.  int
28bb0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28bd0 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
28be0 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20  X_QUERY_X flags 
28bf0 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
28c00 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
28c10 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68       /* Match th
28c20 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79  ese columns only
28c30 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
28c40 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
28c50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
28c60 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  w iterator objec
28c70 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  t */.){.  Fts5Co
28c80 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
28c90 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74  p->pConfig;.  Ft
28ca0 73 35 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30  s5Iter *pRet = 0
28cb0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
28cc0 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  uf = {0, 0, 0};.
28cd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45  .  /* If the QUE
28ce0 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20  RY_SCAN flag is 
28cf0 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66  set, all other f
28d00 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65  lags must be cle
28d10 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ar. */.  assert(
28d20 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
28d30 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d  DEX_QUERY_SCAN)=
28d40 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53  =0 || flags==FTS
28d50 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
28d60 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  N );..  if( sqli
28d70 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
28d80 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  e(&p->rc, &buf, 
28d90 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a  nToken+1)==0 ){.
28da0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30      int iIdx = 0
28db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28dc0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65    /* Index to se
28dd0 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20  arch */.    if( 
28de0 6e 54 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28  nToken ) memcpy(
28df0 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65  &buf.p[1], pToke
28e00 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20  n, nToken);..   
28e10 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
28e20 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65  hich index to se
28e30 61 72 63 68 20 61 6e 64 20 73 65 74 20 69 49 64  arch and set iId
28e40 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  x accordingly. I
28e50 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  f this.    ** is
28e60 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79 20   a prefix query 
28e70 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
28e80 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64  is no prefix ind
28e90 65 78 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a  ex, set iIdx to.
28ea0 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74      ** greater t
28eb0 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  han pConfig->nPr
28ec0 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65  efix to indicate
28ed0 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
28ee0 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73  will be.    ** s
28ef0 61 74 69 73 66 69 65 64 20 62 79 20 73 63 61 6e  atisfied by scan
28f00 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65  ning multiple te
28f10 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rms in the main 
28f20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
28f30 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52    ** If the QUER
28f40 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61  Y_TEST_NOIDX fla
28f50 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  g was specified,
28f60 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20   then this must 
28f70 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66  be a.    ** pref
28f80 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61  ix-query. Instea
28f90 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65  d of using a pre
28fa0 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e  fix-index (if on
28fb0 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20  e exists), .    
28fc0 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  ** evaluate the 
28fd0 70 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69  prefix query usi
28fe0 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20  ng the main FTS 
28ff0 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75  index. This is u
29000 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69  sed.    ** for i
29010 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63  nternal sanity c
29020 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69  hecking by the i
29030 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69  ntegrity-check i
29040 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20  n debug .    ** 
29050 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23  mode only.  */.#
29060 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
29070 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  UG.    if( pConf
29080 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78  ig->bPrefixIndex
29090 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
290a0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
290b0 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20  TEST_NOIDX) ){. 
290c0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
290d0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
290e0 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20  UERY_PREFIX );. 
290f0 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43       iIdx = 1+pC
29100 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a  onfig->nPrefix;.
29110 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
29120 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
29130 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
29140 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
29150 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73   int nChar = fts
29160 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54  5IndexCharlen(pT
29170 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
29180 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b       for(iIdx=1;
29190 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
291a0 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
291b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
291c0 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
291d0 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20  Idx-1]==nChar ) 
291e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
291f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49     }..    if( iI
29200 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
29210 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  efix ){.      /*
29220 20 53 74 72 61 69 67 68 74 20 69 6e 64 65 78 20   Straight index 
29230 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20  lookup */.      
29240 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
29250 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
29260 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
29270 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
29280 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50  (u8)(FTS5_MAIN_P
29290 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20  REFIX + iIdx);. 
292a0 20 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74       if( pStruct
292b0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
292c0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
292d0 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c  pStruct, flags |
292e0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
292f0 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20  _SKIPEMPTY, .   
29300 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74           pColset
29310 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
29320 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a  1, -1, 0, &pRet.
29330 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29340 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
29350 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
29360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
29370 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63  lse{.      /* Sc
29380 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  an multiple term
29390 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
293a0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
293b0 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20   bDesc = (flags 
293c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
293d0 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20  Y_DESC)!=0;.    
293e0 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53    buf.p[0] = FTS
293f0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20  5_MAIN_PREFIX;. 
29400 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72       fts5SetupPr
29410 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73  efixIter(p, bDes
29420 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  c, buf.p, nToken
29430 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52  +1, pColset, &pR
29440 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  et);.      asser
29450 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
29460 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f  _OK || pRet->pCo
29470 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lset==0 );.     
29480 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
29490 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65  utCb(&p->rc, pRe
294a0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  t);.      if( p-
294b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
294c0 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65  {.        Fts5Se
294d0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
294e0 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e  Ret->aSeg[pRet->
294f0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
29500 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
29510 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65  Seg->pLeaf ) pRe
29520 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70  t->xSetOutputs(p
29530 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  Ret, pSeg);.    
29540 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
29550 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
29560 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
29570 72 43 6c 6f 73 65 28 28 46 74 73 35 49 6e 64 65  rClose((Fts5Inde
29580 78 49 74 65 72 2a 29 70 52 65 74 29 3b 0a 20 20  xIter*)pRet);.  
29590 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
295a0 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
295b0 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20  der(p);.    }.. 
295c0 20 20 20 2a 70 70 49 74 65 72 20 3d 20 26 70 52     *ppIter = &pR
295d0 65 74 2d 3e 62 61 73 65 3b 0a 20 20 20 20 73 71  et->base;.    sq
295e0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
295f0 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20  ree(&buf);.  }. 
29600 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
29610 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
29620 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
29630 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
29640 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
29650 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nly argument is 
29660 61 74 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  at EOF..*/./*.**
29670 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
29680 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
29690 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
296a0 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74  3Fts5IterNext(Ft
296b0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
296c0 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35  dexIter){.  Fts5
296d0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46  Iter *pIter = (F
296e0 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49  ts5Iter*)pIndexI
296f0 74 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ter;.  assert( p
29700 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
29710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
29720 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
29730 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  xt(pIter->pIndex
29740 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a  , pIter, 0, 0);.
29750 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
29760 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
29770 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
29780 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
29790 78 74 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d  xt matching term
297a0 2f 72 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20  /rowid. Used by 
297b0 74 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f  the fts5vocab mo
297c0 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dule..*/.int sql
297d0 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
297e0 53 63 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74  Scan(Fts5IndexIt
297f0 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
29800 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
29810 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
29820 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 46 74  pIndexIter;.  Ft
29830 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74  s5Index *p = pIt
29840 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61  er->pIndex;..  a
29850 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
29860 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ndex->rc==SQLITE
29870 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75  _OK );..  fts5Mu
29880 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
29890 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Iter, 0, 0);.  i
298a0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
298b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
298c0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
298d0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
298e0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
298f0 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20  irst ];.    if( 
29900 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70  pSeg->pLeaf && p
29910 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d  Seg->term.p[0]!=
29920 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
29930 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
29940 74 61 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e  taRelease(pSeg->
29950 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53  pLeaf);.      pS
29960 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  eg->pLeaf = 0;. 
29970 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65       pIter->base
29980 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  .bEof = 1;.    }
29990 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66  .  }..  return f
299a0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
299b0 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
299c0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
299d0 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
299e0 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63  g rowid that occ
299f0 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20  urs at or after 
29a00 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64  iMatch. The.** d
29a10 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74  efinition of "at
29a20 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e   or after" depen
29a30 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ds on whether th
29a40 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72  is iterator iter
29a50 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  ates.** in ascen
29a60 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69  ding or descendi
29a70 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a  ng rowid order..
29a80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
29a90 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46  s5IterNextFrom(F
29aa0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
29ab0 6e 64 65 78 49 74 65 72 2c 20 69 36 34 20 69 4d  ndexIter, i64 iM
29ac0 61 74 63 68 29 7b 0a 20 20 46 74 73 35 49 74 65  atch){.  Fts5Ite
29ad0 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35  r *pIter = (Fts5
29ae0 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
29af0 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ;.  fts5MultiIte
29b00 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d  rNextFrom(pIter-
29b10 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
29b20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72  iMatch);.  retur
29b30 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
29b40 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
29b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29b60 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  n the current te
29b70 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  rm..*/.const cha
29b80 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74  r *sqlite3Fts5It
29b90 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
29ba0 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
29bb0 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e  , int *pn){.  in
29bc0 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
29bd0 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
29be0 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
29bf0 72 54 65 72 6d 28 28 46 74 73 35 49 74 65 72 2a  rTerm((Fts5Iter*
29c00 29 70 49 6e 64 65 78 49 74 65 72 2c 20 26 6e 29  )pIndexIter, &n)
29c10 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20  ;.  *pn = n-1;. 
29c20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d   return &z[1];.}
29c30 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
29c40 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64   iterator opened
29c50 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
29c60 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
29c70 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
29c80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
29c90 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
29ca0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
29cb0 65 78 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  exIter){.  if( p
29cc0 49 6e 64 65 78 49 74 65 72 20 29 7b 0a 20 20 20  IndexIter ){.   
29cd0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
29ce0 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
29cf0 6e 64 65 78 49 74 65 72 3b 0a 20 20 20 20 46 74  ndexIter;.    Ft
29d00 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20  s5Index *pIndex 
29d10 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b  = pIter->pIndex;
29d20 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
29d30 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
29d40 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
29d50 65 72 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  er(pIndex);.  }.
29d60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
29d70 64 20 64 65 63 6f 64 65 20 74 68 65 20 22 61 76  d decode the "av
29d80 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 66  erages" record f
29d90 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
29da0 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  . .**.** Paramet
29db0 65 72 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70  er anSize must p
29dc0 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79  oint to an array
29dd0 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77   of size nCol, w
29de0 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20  here nCol is.** 
29df0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
29e00 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er defined colum
29e10 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61  ns in the FTS ta
29e20 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
29e30 74 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41  te3Fts5IndexGetA
29e40 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
29e50 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77  x *p, i64 *pnRow
29e60 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a  , i64 *anSize){.
29e70 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
29e80 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20  pConfig->nCol;. 
29e90 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
29ea0 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b  ;..  *pnRow = 0;
29eb0 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65  .  memset(anSize
29ec0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29  , 0, sizeof(i64)
29ed0 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74   * nCol);.  pDat
29ee0 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
29ef0 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
29f00 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20  S_ROWID);.  if( 
29f10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
29f20 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b   && pData->nn ){
29f30 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
29f40 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
29f50 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
29f60 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
29f70 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b  ], (u64*)pnRow);
29f80 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
29f90 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20   i<pData->nn && 
29fa0 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  iCol<nCol; iCol+
29fb0 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66  +){.      i += f
29fc0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
29fd0 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a  ata->p[i], (u64*
29fe0 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b  )&anSize[iCol]);
29ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
2a000 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
2a010 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ata);.  return f
2a020 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
2a030 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  );.}../*.** Repl
2a040 61 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ace the current 
2a050 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
2a060 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  d with the conte
2a070 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  nts of the buffe
2a080 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61  r .** supplied a
2a090 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a0a0 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
2a0b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
2a0c0 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
2a0d0 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38  dex *p, const u8
2a0e0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2a0f0 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ta){.  assert( p
2a100 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2a110 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
2a120 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
2a130 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61  GES_ROWID, pData
2a140 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  , nData);.  retu
2a150 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
2a160 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
2a170 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
2a180 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b   number of block
2a190 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  s this module ha
2a1a0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2a1b0 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  %_data.** table 
2a1c0 73 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65  since it was cre
2a1d0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
2a1e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61  ite3Fts5IndexRea
2a1f0 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ds(Fts5Index *p)
2a200 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  {.  return p->nR
2a210 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ead;.}../*.** Se
2a220 74 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f  t the 32-bit coo
2a230 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  kie value stored
2a240 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2a250 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a   all structure .
2a260 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ** records to th
2a270 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2a280 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a290 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ument..**.** Ret
2a2a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2a2b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
2a2c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2a2d0 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
2a2e0 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
2a2f0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2a300 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73  dexSetCookie(Fts
2a310 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
2a320 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  New){.  int rc; 
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a350 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2a360 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2a370 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
2a380 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75  g;    /* Configu
2a390 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ration object */
2a3a0 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d  .  u8 aCookie[4]
2a3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a3c0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72          /* Binar
2a3d0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
2a3e0 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71   of iNew */.  sq
2a3f0 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
2a400 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  b = 0;..  assert
2a410 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2a420 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  OK );.  sqlite3F
2a430 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65  ts5Put32(aCookie
2a440 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d  , iNew);..  rc =
2a450 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
2a460 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  en(pConfig->db, 
2a470 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
2a480 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20  >zDataTbl, .    
2a490 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f    "block", FTS5_
2a4a0 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c  STRUCTURE_ROWID,
2a4b0 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a   1, &pBlob.  );.
2a4c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a4d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2a4e0 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42  e3_blob_write(pB
2a4f0 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c  lob, aCookie, 4,
2a500 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2a510 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
2a520 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20  (pBlob);.  }..  
2a530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
2a540 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2a550 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73  exLoadConfig(Fts
2a560 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
2a570 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
2a580 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20  ruct;.  pStruct 
2a590 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
2a5a0 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74  ead(p);.  fts5St
2a5b0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2a5c0 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72  Struct);.  retur
2a5d0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
2a5e0 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  n(p);.}.../*****
2a5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a630 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2a640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2a680 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f  ** Below this po
2a690 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65  int is the imple
2a6a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
2a6b0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
2a6c0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69   .** functionali
2a6d0 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ty..*/../*.** Re
2a6e0 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68  turn a simple ch
2a6f0 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73  ecksum value bas
2a700 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  ed on the argume
2a710 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  nts..*/.u64 sqli
2a720 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2a730 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52  yCksum(.  i64 iR
2a740 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f  owid, .  int iCo
2a750 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20  l, .  int iPos, 
2a760 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63  .  int iIdx,.  c
2a770 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
2a780 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b  ,.  int nTerm.){
2a790 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
2a7a0 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  ret = iRowid;.  
2a7b0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2a7c0 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
2a7d0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
2a7e0 3b 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20  ;.  if( iIdx>=0 
2a7f0 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
2a800 29 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50  ) + (FTS5_MAIN_P
2a810 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20  REFIX + iIdx);. 
2a820 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
2a830 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28  m; i++) ret += (
2a840 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b  ret<<3) + pTerm[
2a850 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  i];.  return ret
2a860 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2a870 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
2a880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a890 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
2a8a0 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
2a8b0 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
2a8c0 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
2a8d0 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
2a8e0 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
2a8f0 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
2a900 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  y..**.** Instead
2a910 2c 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20  , it tests that 
2a920 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
2a930 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69  pgno/rowid combi
2a940 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20  nations are .** 
2a950 76 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65  visited regardle
2a960 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
2a970 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
2a980 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
2a990 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67  rameters.** iSeg
2a9a0 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72  id/iLeaf is iter
2a9b0 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73  ated in forwards
2a9c0 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65   or reverse orde
2a9d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2a9e0 64 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  d fts5TestDlidxR
2a9f0 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
2aa00 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69  dex *p, .  int i
2aa10 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
2aa20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2aa30 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
2aa40 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
2aa50 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
2aa60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2aa70 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
2aa80 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2aa90 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
2aaa0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
2aab0 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  u64 cksum1 =
2aac0 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d   13;.  u64 cksum
2aad0 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70  2 = 13;..  for(p
2aae0 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
2aaf0 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53  terInit(p, 0, iS
2ab00 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20  egid, iLeaf);.  
2ab10 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2ab20 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
2ab30 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  =0;.      fts5Dl
2ab40 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
2ab50 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20  Dlidx).  ){.    
2ab60 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
2ab70 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
2ab80 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74  pDlidx);.    int
2ab90 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64   pgno = fts5Dlid
2aba0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
2abb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2abc0 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  gno>iLeaf );.   
2abd0 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69   cksum1 += iRowi
2abe0 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c  d + ((i64)pgno<<
2abf0 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  32);.  }.  fts5D
2ac00 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
2ac10 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
2ac20 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64   0;..  for(pDlid
2ac30 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
2ac40 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64  nit(p, 1, iSegid
2ac50 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
2ac60 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
2ac70 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
2ac80 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2ac90 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64  terPrev(p, pDlid
2aca0 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
2acb0 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
2acc0 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
2acd0 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
2ace0 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
2acf0 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
2ad00 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
2ad10 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2ad20 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20  idx)>iLeaf );.  
2ad30 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77    cksum2 += iRow
2ad40 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c  id + ((i64)pgno<
2ad50 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  <32);.  }.  fts5
2ad60 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
2ad70 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20  lidx);.  pDlidx 
2ad80 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
2ad90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ada0 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29  cksum1!=cksum2 )
2adb0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2adc0 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63  RRUPT;.}..static
2add0 20 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b   int fts5QueryCk
2ade0 73 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sum(.  Fts5Index
2adf0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2ae00 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69         /* Fts5 i
2ae10 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
2ae20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
2ae30 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae50 49 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65  Index key to que
2ae60 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
2ae70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ae90 69 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79  ize of index key
2aea0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
2aeb0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aed0 2a 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35  * Flags for Fts5
2aee0 49 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20  IndexQuery */.  
2aef0 75 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20  u64 *pCksum     
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af10 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b  /* IN/OUT: Check
2af20 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  sum value */.){.
2af30 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
2af40 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
2af50 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d  ail;.  u64 cksum
2af60 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74   = *pCksum;.  Ft
2af70 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
2af80 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  er = 0;.  int rc
2af90 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
2afa0 64 65 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e  dexQuery(p, z, n
2afb0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 26 70 49 74  , flags, 0, &pIt
2afc0 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72  er);..  while( r
2afd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2afe0 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74  0==sqlite3Fts5It
2aff0 65 72 45 6f 66 28 70 49 74 65 72 29 20 29 7b 0a  erEof(pIter) ){.
2b000 20 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20      i64 rowid = 
2b010 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a  pIter->iRowid;..
2b020 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
2b030 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
2b040 45 20 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d  E ){.      cksum
2b050 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2b060 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
2b070 6f 77 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78  owid, 0, 0, iIdx
2b080 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  , z, n);.    }el
2b090 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f  se{.      Fts5Po
2b0a0 73 6c 69 73 74 52 65 61 64 65 72 20 73 52 65 61  slistReader sRea
2b0b0 64 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73  der;.      for(s
2b0c0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2b0d0 74 52 65 61 64 65 72 49 6e 69 74 28 70 49 74 65  tReaderInit(pIte
2b0e0 72 2d 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d  r->pData, pIter-
2b0f0 3e 6e 44 61 74 61 2c 20 26 73 52 65 61 64 65 72  >nData, &sReader
2b100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52 65  );.          sRe
2b110 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20  ader.bEof==0;.  
2b120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
2b130 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2b140 4e 65 78 74 28 26 73 52 65 61 64 65 72 29 0a 20  Next(&sReader). 
2b150 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b160 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
2b170 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64  POS2COLUMN(sRead
2b180 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
2b190 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53    int iOff = FTS
2b1a0 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65  5_POS2OFFSET(sRe
2b1b0 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20  ader.iPos);.    
2b1c0 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c      cksum ^= sql
2b1d0 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2b1e0 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69  ryCksum(rowid, i
2b1f0 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c  Col, iOff, iIdx,
2b200 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
2b210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b240 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49  3Fts5IterNext(pI
2b250 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
2b260 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
2b270 72 43 6c 6f 73 65 28 70 49 74 65 72 29 3b 0a 0a  rClose(pIter);..
2b280 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75    *pCksum = cksu
2b290 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  m;.  return rc;.
2b2a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
2b2b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  unction is also 
2b2c0 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
2b2d0 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
2b2e0 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
2b2f0 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
2b300 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
2b310 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
2b320 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
2b330 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2b340 64 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a  d fts5TestTerm(.
2b350 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
2b360 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2b370 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
2b380 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
2b390 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  erm */.  const c
2b3a0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20  har *z, int n,  
2b3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
2b3c0 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f  ibly new term to
2b3d0 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65   test */.  u64 e
2b3e0 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a  xpected,.  u64 *
2b3f0 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20  pCksum.){.  int 
2b400 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
2b410 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b  ( pPrev->n==0 ){
2b420 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
2b430 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e  et(&rc, pPrev, n
2b440 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b  , (const u8*)z);
2b450 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72  .  }else.  if( r
2b460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b470 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20  (pPrev->n!=n || 
2b480 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c  memcmp(pPrev->p,
2b490 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75   z, n)) ){.    u
2b4a0 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b  64 cksum3 = *pCk
2b4b0 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  sum;.    const c
2b4c0 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f  har *zTerm = (co
2b4d0 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72 65 76  nst char*)&pPrev
2b4e0 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d  ->p[1];  /* term
2b4f0 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74   sans prefix-byt
2b500 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
2b510 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b  rm = pPrev->n-1;
2b520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2b530 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
2b540 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
2b550 20 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e   iIdx = (pPrev->
2b560 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e  p[0] - FTS5_MAIN
2b570 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e  _PREFIX);.    in
2b580 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d  t flags = (iIdx=
2b590 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44  =0 ? 0 : FTS5IND
2b5a0 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
2b5b0 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20  ;.    u64 ck1 = 
2b5c0 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d  0;.    u64 ck2 =
2b5d0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   0;..    /* Chec
2b5e0 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
2b5f0 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  ts returned for 
2b600 41 53 43 20 61 6e 64 20 44 45 53 43 20 71 75 65  ASC and DESC que
2b610 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ries are.    ** 
2b620 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74  the same. If not
2b630 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72  , call this corr
2b640 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2b650 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
2b660 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
2b670 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
2b680 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28  , &ck1);.    if(
2b690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b6a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20  {.      int f = 
2b6b0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
2b6c0 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
2b6d0 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
2b6e0 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
2b6f0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20  Term, nTerm, f, 
2b700 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &ck2);.    }.   
2b710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b720 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
2b730 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
2b740 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  PT;..    /* If t
2b750 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78 20  his is a prefix 
2b760 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61  query, check tha
2b770 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65  t the results re
2b780 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20  turned if the.  
2b790 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
2b7a0 73 20 64 69 73 61 62 6c 65 64 20 61 72 65 20 74  s disabled are t
2b7b0 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68  he same. In both
2b7c0 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72   ASC and DESC or
2b7d0 64 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  der. .    **.   
2b7e0 20 2a 2a 20 54 68 69 73 20 63 68 65 63 6b 20 6d   ** This check m
2b7f0 61 79 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  ay only be perfo
2b800 72 6d 65 64 20 69 66 20 74 68 65 20 68 61 73 68  rmed if the hash
2b810 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2b820 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
2b830 62 65 63 61 75 73 65 20 74 68 65 20 68 61 73 68  because the hash
2b840 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70   table only supp
2b850 6f 72 74 73 20 61 20 73 69 6e 67 6c 65 20 73 63  orts a single sc
2b860 61 6e 20 71 75 65 72 79 20 61 74 0a 20 20 20 20  an query at.    
2b870 2a 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64 20 74  ** a time, and t
2b880 68 65 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f  he multi-iter lo
2b890 6f 70 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  op from which th
2b8a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2b8b0 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73 20  alled.    ** is 
2b8c0 61 6c 72 65 61 64 79 20 70 65 72 66 6f 72 6d 69  already performi
2b8d0 6e 67 20 73 75 63 68 20 61 20 73 63 61 6e 2e 20  ng such a scan. 
2b8e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  */.    if( p->nP
2b8f0 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b  endingData==0 ){
2b900 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e  .      if( iIdx>
2b910 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
2b920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
2b930 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
2b940 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
2b950 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20  _NOIDX;.        
2b960 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ck2 = 0;.       
2b970 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
2b980 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
2b990 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26  erm, nTerm, f, &
2b9a0 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ck2);.        if
2b9b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b9c0 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63  && ck1!=ck2 ) rc
2b9d0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2b9e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b9f0 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d  f( iIdx>0 && rc=
2ba00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ba10 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
2ba20 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  ags|FTS5INDEX_QU
2ba30 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46  ERY_TEST_NOIDX|F
2ba40 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
2ba50 45 53 43 3b 0a 20 20 20 20 20 20 20 20 63 6b 32  ESC;.        ck2
2ba60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2ba70 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
2ba80 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
2ba90 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
2baa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2bab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bac0 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
2bad0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2bae0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2baf0 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a   cksum3 ^= ck1;.
2bb00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
2bb10 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c  t(&rc, pPrev, n,
2bb20 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a   (const u8*)z);.
2bb30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2bb40 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33  ITE_OK && cksum3
2bb50 21 3d 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20  !=expected ){.  
2bb60 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
2bb70 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
2bb80 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d   *pCksum = cksum
2bb90 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d  3;.  }.  p->rc =
2bba0 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23   rc;.}. .#else.#
2bbb0 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74   define fts5Test
2bbc0 44 6c 69 64 78 52 65 76 65 72 73 65 28 78 2c 79  DlidxReverse(x,y
2bbd0 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73  ,z).# define fts
2bbe0 35 54 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c  5TestTerm(u,v,w,
2bbf0 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
2bc00 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 3a  *.** Check that:
2bc10 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20  .**.**   1) All 
2bc20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62  leaves of pSeg b
2bc30 65 74 77 65 65 6e 20 69 46 69 72 73 74 20 61 6e  etween iFirst an
2bc40 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69  d iLast (inclusi
2bc50 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a  ve) exist and.**
2bc60 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65        contain ze
2bc70 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32  ro terms..**   2
2bc80 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
2bc90 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 4e 6f  pSeg between iNo
2bca0 52 6f 77 69 64 20 61 6e 64 20 69 4c 61 73 74 20  Rowid and iLast 
2bcb0 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73  (inclusive) exis
2bcc0 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f  t and.**      co
2bcd0 6e 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64  ntain zero rowid
2bce0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2bcf0 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67  d fts5IndexInteg
2bd00 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a  rityCheckEmpty(.
2bd10 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
2bd20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
2bd30 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
2bd40 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
2bd50 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
2bd60 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20  onsistency */.  
2bd70 69 6e 74 20 69 46 69 72 73 74 2c 0a 20 20 69 6e  int iFirst,.  in
2bd80 74 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e  t iNoRowid,.  in
2bd90 74 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74  t iLast.){.  int
2bda0 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68   i;..  /* Now ch
2bdb0 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65  eck that the ite
2bdc0 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20  r.nEmpty leaves 
2bdd0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75  following the cu
2bde0 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20  rrent leaf.  ** 
2bdf0 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62  (a) exist and (b
2be00 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72  ) contain no ter
2be10 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69  ms. */.  for(i=i
2be20 46 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51  First; p->rc==SQ
2be30 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c  LITE_OK && i<=iL
2be40 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ast; i++){.    F
2be50 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
2be60 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
2be70 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2be80 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
2be90 2c 20 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , i));.    if( p
2bea0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
2beb0 28 20 21 66 74 73 35 4c 65 61 66 49 73 54 65 72  ( !fts5LeafIsTer
2bec0 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 20 70  mless(pLeaf) ) p
2bed0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2bee0 55 50 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69  UPT;.      if( i
2bef0 3e 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21  >=iNoRowid && 0!
2bf00 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f  =fts5LeafFirstRo
2bf10 77 69 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20  widOff(pLeaf) ) 
2bf20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2bf30 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
2bf40 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2bf50 70 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pLeaf);.  }.}..s
2bf60 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
2bf70 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69  ntegrityCheckPgi
2bf80 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
2bf90 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
2bfa0 29 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  ){.  int iTermOf
2bfb0 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b  f = 0;.  int ii;
2bfc0 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ..  Fts5Buffer b
2bfd0 75 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20  uf1 = {0,0,0};. 
2bfe0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 32   Fts5Buffer buf2
2bff0 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69   = {0,0,0};..  i
2c000 69 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  i = pLeaf->szLea
2c010 66 3b 0a 20 20 77 68 69 6c 65 28 20 69 69 3c 70  f;.  while( ii<p
2c020 4c 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72  Leaf->nn && p->r
2c030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c040 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
2c050 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
2c060 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69  nt nIncr;..    i
2c070 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
2c080 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2c090 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20  i], nIncr);.    
2c0a0 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63  iTermOff += nInc
2c0b0 72 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54  r;.    iOff = iT
2c0c0 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28  ermOff;..    if(
2c0d0 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a   iOff>=pLeaf->sz
2c0e0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d  Leaf ){.      p-
2c0f0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2c100 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
2c110 28 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63  ( iTermOff==nInc
2c120 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
2c130 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66  Byte;.      iOff
2c140 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2c150 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
2c160 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2c170 20 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 42 79     if( (iOff+nBy
2c180 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
2c190 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
2c1a0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c1b0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2c1c0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
2c1d0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62  erSet(&p->rc, &b
2c1e0 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65  uf1, nByte, &pLe
2c1f0 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  af->p[iOff]);.  
2c200 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2c210 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  .      int nKeep
2c220 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  , nByte;.      i
2c230 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2c240 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2c250 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
2c260 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2c270 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2c280 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2c290 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
2c2a0 20 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c   nKeep>buf1.n ||
2c2b0 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c   (iOff+nByte)>pL
2c2c0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c2d0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
2c2e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c2f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c300 20 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70    buf1.n = nKeep
2c310 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
2c320 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
2c330 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42  p->rc, &buf1, nB
2c340 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69  yte, &pLeaf->p[i
2c350 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Off]);.      }..
2c360 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
2c370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c380 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35        res = fts5
2c390 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 62  BufferCompare(&b
2c3a0 75 66 31 2c 20 26 62 75 66 32 29 3b 0a 20 20 20  uf1, &buf2);.   
2c3b0 20 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20       if( res<=0 
2c3c0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2c3d0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2c3e0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
2c3f0 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
2c400 26 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62  &buf2, buf1.n, b
2c410 75 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66  uf1.p);.  }..  f
2c420 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2c430 75 66 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66  uf1);.  fts5Buff
2c440 65 72 46 72 65 65 28 26 62 75 66 32 29 3b 0a 7d  erFree(&buf2);.}
2c450 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
2c460 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
2c470 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20  CheckSegment(.  
2c480 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
2c4b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
2c4c0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2c4d0 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53   *pSeg      /* S
2c4e0 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  egment to check 
2c4f0 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74  internal consist
2c500 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ency */.){.  Fts
2c510 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2c520 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
2c530 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c540 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Stmt = 0;.  int 
2c550 72 63 32 3b 0a 20 20 69 6e 74 20 69 49 64 78 50  rc2;.  int iIdxP
2c560 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
2c570 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69  pgnoFirst-1;.  i
2c580 6e 74 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61  nt iDlidxPrevLea
2c590 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  f = pSeg->pgnoLa
2c5a0 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d  st;..  if( pSeg-
2c5b0 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20  >pgnoFirst==0 ) 
2c5c0 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49  return;..  fts5I
2c5d0 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
2c5e0 70 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c 69 74  p, &pStmt, sqlit
2c5f0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2c600 20 20 22 53 45 4c 45 43 54 20 73 65 67 69 64 2c    "SELECT segid,
2c610 20 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29   term, (pgno>>1)
2c620 2c 20 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20  , (pgno&1) FROM 
2c630 25 51 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52  %Q.'%q_idx' WHER
2c640 45 20 73 65 67 69 64 3d 25 64 22 2c 0a 20 20 20  E segid=%d",.   
2c650 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
2c660 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c   pConfig->zName,
2c670 20 70 53 65 67 2d 3e 69 53 65 67 69 64 0a 20 20   pSeg->iSegid.  
2c680 29 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74  ));..  /* Iterat
2c690 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d  e through the b-
2c6a0 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 20  tree hierarchy. 
2c6b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   */.  while( p->
2c6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c6d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2c6e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2c6f0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
2c700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c710 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
2c720 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
2c730 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
2c740 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2c750 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68    /* Data for th
2c760 69 73 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20  is leaf */..    
2c770 69 6e 74 20 6e 49 64 78 54 65 72 6d 20 3d 20 73  int nIdxTerm = s
2c780 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
2c790 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  tes(pStmt, 1);. 
2c7a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c7b0 49 64 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74  IdxTerm = (const
2c7c0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
2c7d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2c7e0 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 49  , 1);.    int iI
2c7f0 64 78 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33  dxLeaf = sqlite3
2c800 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2c810 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62  t, 2);.    int b
2c820 49 64 78 44 6c 69 64 78 20 3d 20 73 71 6c 69 74  IdxDlidx = sqlit
2c830 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2c840 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a  tmt, 3);..    /*
2c850 20 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20   If the leaf in 
2c860 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72  question has alr
2c870 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65  eady been trimme
2c880 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65  d from the segme
2c890 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f  nt, .    ** igno
2c8a0 72 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65  re this b-tree e
2c8b0 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  ntry. Otherwise,
2c8c0 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65   load it into me
2c8d0 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  mory. */.    if(
2c8e0 20 69 49 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e   iIdxLeaf<pSeg->
2c8f0 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74  pgnoFirst ) cont
2c900 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d  inue;.    iRow =
2c910 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2c920 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
2c930 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20  , iIdxLeaf);.   
2c940 20 70 4c 65 61 66 20 3d 20 66 74 73 35 4c 65 61   pLeaf = fts5Lea
2c950 66 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a  fRead(p, iRow);.
2c960 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
2c970 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
2c980 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2c990 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61   leaf contains a
2c9a0 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d  t least one term
2c9b0 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73  , and that it is
2c9c0 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f   equal.    ** to
2c9d0 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20   or larger than 
2c9e0 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e  the split-key in
2c9f0 20 7a 49 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f   zIdxTerm.  Also
2ca00 20 63 68 65 63 6b 20 74 68 61 74 20 69 66 20 74   check that if t
2ca10 68 65 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  here.    ** is a
2ca20 6c 73 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e  lso a rowid poin
2ca30 74 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c  ter within the l
2ca40 65 61 66 20 70 61 67 65 20 68 65 61 64 65 72 2c  eaf page header,
2ca50 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a   it points to a.
2ca60 20 20 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20      ** location 
2ca70 62 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e  before the term.
2ca80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
2ca90 61 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73  af->nn<=pLeaf->s
2caa0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  zLeaf ){.      p
2cab0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2cac0 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UPT;.    }else{.
2cad0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20        int iOff; 
2cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caf0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
2cb00 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61  irst term on lea
2cb10 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  f */.      int i
2cb20 52 6f 77 69 64 4f 66 66 3b 20 20 20 20 20 20 20  RowidOff;       
2cb30 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2cb40 20 6f 66 20 66 69 72 73 74 20 72 6f 77 69 64 20   of first rowid 
2cb50 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
2cb60 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb80 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20  Size of term on 
2cb90 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f  leaf in bytes */
2cba0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20  .      int res; 
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbc0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
2cbd0 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c   of term and spl
2cbe0 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20  it-key */..     
2cbf0 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
2cc00 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65  FirstTermOff(pLe
2cc10 61 66 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69  af);.      iRowi
2cc20 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  dOff = fts5LeafF
2cc30 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2cc40 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  af);.      if( i
2cc50 52 6f 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29  RowidOff>=iOff )
2cc60 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
2cc70 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2cc80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cc90 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2cca0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2ccb0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54  eaf->p[iOff], nT
2ccc0 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  erm);.        re
2ccd0 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61  s = memcmp(&pLea
2cce0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78  f->p[iOff], zIdx
2ccf0 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c  Term, MIN(nTerm,
2cd00 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20   nIdxTerm));.   
2cd10 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
2cd20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
2cd30 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20  nIdxTerm;.      
2cd40 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d    if( res<0 ) p-
2cd50 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2cd60 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  PT;.      }..   
2cd70 20 20 20 66 74 73 35 49 6e 74 65 67 72 69 74 79     fts5Integrity
2cd80 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c  CheckPgidx(p, pL
2cd90 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eaf);.    }.    
2cda0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2cdb0 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
2cdc0 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
2cdd0 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
2cde0 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
2cdf0 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
2ce00 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
2ce10 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
2ce20 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
2ce30 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
2ce40 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e  s. */.    fts5In
2ce50 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2ce60 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20  kEmpty(.        
2ce70 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65  p, pSeg, iIdxPre
2ce80 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50  vLeaf+1, iDlidxP
2ce90 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c  revLeaf+1, iIdxL
2cea0 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  eaf-1.    );.   
2ceb0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
2cec0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ak;..    /* If t
2ced0 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
2cee0 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74  t-index, check t
2cef0 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67  hat it looks rig
2cf00 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ht. */.    if( b
2cf10 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  IdxDlidx ){.    
2cf20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
2cf30 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a  *pDlidx = 0;  /*
2cf40 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
2cf50 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69  hrough doclist i
2cf60 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
2cf70 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49  t iPrevLeaf = iI
2cf80 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  dxLeaf;.      in
2cf90 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
2cfa0 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
2cfb0 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20  nt iPg = 0;.    
2cfc0 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20    i64 iKey;..   
2cfd0 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74     for(pDlidx=ft
2cfe0 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
2cff0 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49  p, 0, iSegid, iI
2d000 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  dxLeaf);.       
2d010 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2d020 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
2d030 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  0;.          fts
2d040 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
2d050 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20  , pDlidx).      
2d060 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  ){..        /* C
2d070 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c  heck any rowid-l
2d080 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f  ess pages that o
2d090 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
2d0a0 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
2d0b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67  .        for(iPg
2d0c0 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50  =iPrevLeaf+1; iP
2d0d0 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  g<fts5DlidxIterP
2d0e0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67  gno(pDlidx); iPg
2d0f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2d100 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
2d110 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
2d120 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20   iPg);.         
2d130 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
2d140 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
2d150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
2d160 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d170 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46     if( fts5LeafF
2d180 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2d190 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  af)!=0 ) p->rc =
2d1a0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2d1b0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
2d1c0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d1d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d1f0 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73   iPrevLeaf = fts
2d200 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2d210 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  Dlidx);..       
2d220 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2d230 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64  he leaf page ind
2d240 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
2d250 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f  erator really do
2d260 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  es.        ** co
2d270 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20  ntain the rowid 
2d280 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65  suggested by the
2d290 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   same. */.      
2d2a0 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45    iKey = FTS5_SE
2d2b0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
2d2c0 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a  id, iPrevLeaf);.
2d2d0 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
2d2e0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2d2f0 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  iKey);.        i
2d300 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2d310 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
2d320 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2d330 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2d340 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2d350 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2d360 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
2d370 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20  F_OK(pLeaf);.   
2d380 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
2d390 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  dOff>=pLeaf->szL
2d3a0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d3b0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2d3c0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
2d3d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d3e0 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72        fts5GetVar
2d3f0 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52  int(&pLeaf->p[iR
2d400 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29  owidOff], (u64*)
2d410 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &iRowid);.      
2d420 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2d430 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  !=fts5DlidxIterR
2d440 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70  owid(pDlidx) ) p
2d450 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2d460 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UPT;.          }
2d470 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2d480 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d490 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d4a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69     }..      iDli
2d4b0 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67  dxPrevLeaf = iPg
2d4c0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2d4d0 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
2d4e0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73  );.      fts5Tes
2d4f0 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c  tDlidxReverse(p,
2d500 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61   iSegid, iIdxLea
2d510 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
2d520 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c       iDlidxPrevL
2d530 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
2d540 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Last;.      /* T
2d550 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65  ODO: Check there
2d560 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69   is no doclist i
2d570 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  ndex */.    }.. 
2d580 20 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20     iIdxPrevLeaf 
2d590 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a  = iIdxLeaf;.  }.
2d5a0 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
2d5b0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2d5c0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2d5d0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
2d5e0 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61   = rc2;..  /* Pa
2d5f0 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75  ge iter.iLeaf mu
2d600 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69  st now be the ri
2d610 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67  ghtmost leaf-pag
2d620 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  e in the segment
2d630 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20   */.#if 0.  if( 
2d640 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2d650 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d   && iter.iLeaf!=
2d660 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
2d670 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
2d680 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  S5_CORRUPT;.  }.
2d690 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2d6a0 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68   Run internal ch
2d6b0 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ecks to ensure t
2d6c0 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65  hat the FTS inde
2d6d0 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61  x (a) is interna
2d6e0 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65  lly .** consiste
2d6f0 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  nt and (b) conta
2d700 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
2d710 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66  which the XOR of
2d720 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
2d730 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20  * as calculated 
2d740 62 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  by sqlite3Fts5In
2d750 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20  dexEntryCksum() 
2d760 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  is cksum..**.** 
2d770 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
2d780 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20  RRUPT if any of 
2d790 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  the internal che
2d7a0 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20  cks fail, or if 
2d7b0 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  the.** checksum 
2d7c0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20  does not match. 
2d7d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2d7e0 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70   if all checks p
2d7f0 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65  ass without.** e
2d800 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74  rror, or some ot
2d810 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72  her SQLite error
2d820 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72   code if another
2d830 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d   error (e.g. OOM
2d840 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  ).** occurs..*/.
2d850 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2d860 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2d870 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ck(Fts5Index *p,
2d880 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69   u64 cksum){.  i
2d890 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
2d8a0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
2d8b0 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  ;.  u64 cksum2 =
2d8c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d8d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
2d8e0 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
2d8f0 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
2d900 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
2d910 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
2d920 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
2d930 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
2d940 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72  st */.  Fts5Iter
2d950 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
2d960 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2d970 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2d980 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
2d990 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2d9a0 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
2d9b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
2d9c0 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64  ructure */..#ifd
2d9d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2d9e0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74    /* Used by ext
2d9f0 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  ra internal test
2da00 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44  s only run if ND
2da10 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
2da20 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ned */.  u64 cks
2da30 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um3 = 0;        
2da40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2da50 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2da60 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2da70 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2da80 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d  r term = {0,0,0}
2da90 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ;      /* Buffer
2daa0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f   used to hold mo
2dab0 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a  st recent term *
2dac0 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74  /.#endif.  const
2dad0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
2dae0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
2daf0 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c  UTPUT;.  .  /* L
2db00 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65  oad the FTS inde
2db10 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  x structure */. 
2db20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
2db30 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
2db40 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2db50 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  t the internal n
2db60 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67  odes of each seg
2db70 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c  ment match the l
2db80 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70  eaves */.  if( p
2db90 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
2dba0 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
2dbb0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
2dbc0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
2dbd0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
2dbe0 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2dbf0 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
2dc00 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
2dc10 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
2dc20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2dc30 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2dc40 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
2dc50 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
2dc60 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64  .        fts5Ind
2dc70 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2dc80 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29  Segment(p, pSeg)
2dc90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2dca0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b    }..  /* The ck
2dcb0 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73  sum argument pas
2dcc0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2dcd0 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73  tion is a checks
2dce0 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20  um calculated.  
2dcf0 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ** based on all 
2dd00 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73  expected entries
2dd10 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65   in the FTS inde
2dd20 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65  x (including pre
2dd30 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65  fix index.  ** e
2dd40 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c  ntries). This bl
2dd50 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20  ock checks that 
2dd60 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75  a checksum calcu
2dd70 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  lated based on t
2dd80 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63  he.  ** actual c
2dd90 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69  ontents of FTS i
2dda0 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61  ndex is identica
2ddb0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f  l..  **.  ** Two
2ddc0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
2ddd0 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61   same checksum a
2dde0 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54  re calculated. T
2ddf0 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a  he first (stack.
2de00 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b    ** variable ck
2de10 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65  sum2) based on e
2de20 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64  ntries extracted
2de30 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74   from the full-t
2de40 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77  ext index.  ** w
2de50 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e  hile doing a lin
2de60 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68  ear scan of each
2de70 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65   individual inde
2de80 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a  x in turn. .  **
2de90 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65  .  ** As each te
2dea0 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68  rm visited by th
2deb0 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20  e linear scans, 
2dec0 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79  a separate query
2ded0 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61   for the.  ** sa
2dee0 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f  me term is perfo
2def0 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20  rmed. cksum3 is 
2df00 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
2df10 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a   on the entries.
2df20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62    ** extracted b
2df30 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e  y these queries.
2df40 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35  .  */.  for(fts5
2df50 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
2df60 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20  pStruct, flags, 
2df70 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20  0, 0, 0, -1, 0, 
2df80 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
2df90 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
2dfa0 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
2dfb0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
2dfc0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
2dfd0 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  0, 0).  ){.    i
2dfe0 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
2dff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2e000 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
2e010 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  tes */.    i64 i
2e020 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Pos = 0;        
2e030 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
2e040 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73  on read from pos
2e050 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  list */.    int 
2e060 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  iOff = 0;       
2e070 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2e080 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74  t within poslist
2e090 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77   */.    i64 iRow
2e0a0 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
2e0b0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
2e0c0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63      char *z = (c
2e0d0 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74  har*)fts5MultiIt
2e0e0 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
2e0f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e100 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
2e110 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20  , query for it. 
2e120 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69  Update cksum3 wi
2e130 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  th the results. 
2e140 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54  */.    fts5TestT
2e150 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c  erm(p, &term, z,
2e160 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73   n, cksum2, &cks
2e170 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65  um3);..    if( e
2e180 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2e190 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2e1a0 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c    if( 0==fts5Mul
2e1b0 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
2e1c0 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20   pIter) ){.     
2e1d0 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c     cksum2 ^= sql
2e1e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2e1f0 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
2e200 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  0, 0, -1, z, n);
2e210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2e220 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73  se{.      poslis
2e230 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  t.n = 0;.      f
2e240 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
2e250 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
2e260 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
2e270 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26  1].iFirst], 0, &
2e280 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
2e290 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65  while( 0==sqlite
2e2a0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
2e2b0 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f  64(poslist.p, po
2e2c0 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20  slist.n, &iOff, 
2e2d0 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  &iPos) ){.      
2e2e0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
2e2f0 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f  5_POS2COLUMN(iPo
2e300 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
2e310 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50  iTokOff = FTS5_P
2e320 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b  OS2OFFSET(iPos);
2e330 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20  .        cksum2 
2e340 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2e350 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
2e360 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b  owid, iCol, iTok
2e370 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  Off, -1, z, n);.
2e380 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e390 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d  }.  fts5TestTerm
2e3a0 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c  (p, &term, 0, 0,
2e3b0 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
2e3c0 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
2e3d0 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
2e3e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2e3f0 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21  ITE_OK && cksum!
2e400 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
2e410 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2e420 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2e430 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
2e440 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2e450 44 45 42 55 47 0a 20 20 66 74 73 35 42 75 66 66  DEBUG.  fts5Buff
2e460 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23  erFree(&term);.#
2e470 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66 66  endif.  fts5Buff
2e480 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29  erFree(&poslist)
2e490 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2e4a0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2e4b0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2e4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2e500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e540 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
2e550 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
2e560 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2e570 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  n of the fts5_de
2e580 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a  code() scalar.**
2e590 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a   function only..
2e5a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  */../*.** Decode
2e5b0 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20   a segment-data 
2e5c0 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25  rowid from the %
2e5d0 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69  _data table. Thi
2e5e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
2e5f0 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66   the opposite of
2e600 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d   macro FTS5_SEGM
2e610 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a  ENT_ROWID()..*/.
2e620 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2e630 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69  DecodeRowid(.  i
2e640 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
2e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e660 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64  * Rowid from %_d
2e670 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ata table */.  i
2e680 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20  nt *piSegid,    
2e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e6a0 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69  * OUT: Segment i
2e6b0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c  d */.  int *pbDl
2e6c0 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
2e6d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
2e6e0 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69  lidx flag */.  i
2e6f0 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20  nt *piHeight,   
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e710 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f  * OUT: Height */
2e720 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20  .  int *piPgno  
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e740 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20     /* OUT: Page 
2e750 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a  number */.){.  *
2e760 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69  piPgno = (int)(i
2e770 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e780 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   << FTS5_DATA_PA
2e790 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  GE_B) - 1));.  i
2e7a0 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2e7b0 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a  ATA_PAGE_B;..  *
2e7c0 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29  piHeight = (int)
2e7d0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2e7e0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2e7f0 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b  HEIGHT_B) - 1));
2e800 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2e810 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2e820 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20  ;..  *pbDlidx = 
2e830 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30  (int)(iRowid & 0
2e840 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64  x0001);.  iRowid
2e850 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44   >>= FTS5_DATA_D
2e860 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69  LI_B;..  *piSegi
2e870 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  d = (int)(iRowid
2e880 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2e890 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
2e8a0 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   1));.}..static 
2e8b0 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f  void fts5DebugRo
2e8c0 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  wid(int *pRc, Ft
2e8d0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2e8e0 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74  i64 iKey){.  int
2e8f0 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
2e900 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b  , iPgno, bDlidx;
2e910 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2e920 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20  compenents */.  
2e930 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2e940 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26  iKey, &iSegid, &
2e950 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74  bDlidx, &iHeight
2e960 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66  , &iPgno);..  if
2e970 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2e980 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53     if( iKey==FTS
2e990 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2e9a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e9b0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2e9c0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2e9d0 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22  f, "{averages} "
2e9e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e9f0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2ea00 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ea10 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73  f(pRc, pBuf, "{s
2ea20 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20  tructure}");.   
2ea30 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20   }.  }.  else{. 
2ea40 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ea50 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ea60 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73  (pRc, pBuf, "{%s
2ea70 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67  segid=%d h=%d pg
2ea80 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  no=%d}",.       
2ea90 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78   bDlidx ? "dlidx
2eaa0 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c   " : "", iSegid,
2eab0 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a   iHeight, iPgno.
2eac0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74      );.  }.}..st
2ead0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2eae0 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20  bugStructure(.  
2eaf0 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb10 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2eb20 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2eb30 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46  uffer *pBuf,.  F
2eb40 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a  ts5Structure *p.
2eb50 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  ){.  int iLvl, i
2eb60 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
2eb70 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
2eb80 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20  through levels, 
2eb90 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66  segments */..  f
2eba0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
2ebb0 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  p->nLevel; iLvl+
2ebc0 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  +){.    Fts5Stru
2ebd0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
2ebe0 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c   = &p->aLevel[iL
2ebf0 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  vl];.    sqlite3
2ec00 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ec10 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ec20 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76  , .        " {lv
2ec30 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e  l=%d nMerge=%d n
2ec40 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  Seg=%d", iLvl, p
2ec50 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76  Lvl->nMerge, pLv
2ec60 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20  l->nSeg.    );. 
2ec70 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2ec80 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
2ec90 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iSeg++){.      F
2eca0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2ecb0 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
2ecc0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
2ecd0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ece0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ecf0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2ed00 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64  {id=%d leaves=%d
2ed10 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20  ..%d}", .       
2ed20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c     pSeg->iSegid,
2ed30 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2ed40 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
2ed50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2ed60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2ed70 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ed80 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22  f(pRc, pBuf, "}"
2ed90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2eda0 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2edb0 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2edc0 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2edd0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2ede0 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2edf0 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65  tain a serialize
2ee00 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  d Fts5Structure 
2ee10 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20  object. This.** 
2ee20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2ee30 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2ee40 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2ee50 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a   of the same obj
2ee60 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75  ect.** to the bu
2ee70 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
2ee80 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2ee90 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
2eea0 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74  oid fts5DecodeSt
2eeb0 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
2eec0 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2eed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2eee0 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2eef0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2ef00 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2ef10 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2ef20 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Blob.){.  int rc
2ef30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ef40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2ef50 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
2ef60 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d  s5Structure *p =
2ef70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2ef80 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75   Decoded structu
2ef90 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  re object */..  
2efa0 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
2efb0 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20  reDecode(pBlob, 
2efc0 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20  nBlob, 0, &p);. 
2efd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2efe0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
2eff0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2f000 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75  .  }..  fts5Debu
2f010 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20  gStructure(pRc, 
2f020 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35  pBuf, p);.  fts5
2f030 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2f040 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
2f050 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2f060 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2f070 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2f080 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2f090 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2f0a0 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22  in an "averages"
2f0b0 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75   record. This fu
2f0c0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e  nction .** appen
2f0d0 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f0e0 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2f0f0 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  on of record to 
2f100 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
2f110 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  d .** as the sec
2f120 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2f130 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2f140 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73  s5DecodeAverages
2f150 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f170 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2f180 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2f190 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f1a0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
2f1b0 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
2f1c0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
2f1d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
2f1e0 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c  ce = "";..  whil
2f1f0 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20  e( i<nBlob ){.  
2f200 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
2f210 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
2f220 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62  GetVarint(&pBlob
2f230 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
2f240 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f250 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f260 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22  Rc, pBuf, "%s%d"
2f270 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69  , zSpace, (int)i
2f280 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65  Val);.    zSpace
2f290 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = " ";.  }.}../
2f2a0 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e  *.** Buffer (a/n
2f2b0 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
2f2c0 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f  contain a list o
2f2d0 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72  f serialized var
2f2e0 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61  ints. Read.** ea
2f2f0 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  ch varint and ap
2f300 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20  pend its string 
2f310 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74  representation t
2f320 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52  o buffer pBuf. R
2f330 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65  eturn.** after e
2f340 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20  ither the input 
2f350 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
2f360 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65  ted or a 0 value
2f370 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
2f380 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2f390 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2f3a0 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2f3b0 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2f3c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2f3d0 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  t fts5DecodePosl
2f3e0 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2f3f0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2f400 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2f410 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20   n){.  int iOff 
2f420 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  = 0;.  while( iO
2f430 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
2f440 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  iVal;.    iOff +
2f450 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2f460 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c  2(&a[iOff], iVal
2f470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2f480 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2f490 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2f4a0 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20  " %d", iVal);.  
2f4b0 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  }.  return iOff;
2f4c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
2f4d0 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61  art of buffer (a
2f4e0 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  /n) contains the
2f4f0 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c   start of a docl
2f500 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ist. The doclist
2f510 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  .** may or may n
2f520 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e  ot finish within
2f530 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69   the buffer. Thi
2f540 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
2f550 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70  ds a text.** rep
2f560 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2f570 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  he part of the d
2f580 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70  oclist that is p
2f590 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72  resent to buffer
2f5a0 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a  .** pBuf. .**.**
2f5b0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2f5c0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2f5d0 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
2f5e0 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
2f5f0 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
2f600 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  nt fts5DecodeDoc
2f610 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
2f620 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f630 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
2f640 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63  t n){.  i64 iDoc
2f650 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  id = 0;.  int iO
2f660 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e  ff = 0;..  if( n
2f670 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d  >0 ){.    iOff =
2f680 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
2f690 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
2f6a0 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c  iDocid);.    sql
2f6b0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2f6c0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2f6d0 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2f6e0 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
2f6f0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2f700 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
2f710 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20      int bDel;.  
2f720 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2f730 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
2f740 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
2f750 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Del);.    sqlite
2f760 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2f770 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2f780 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c  f, " nPos=%d%s",
2f790 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a   nPos, bDel?"*":
2f7a0 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  "");.    iOff +=
2f7b0 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2f7c0 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
2f7d0 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
2f7e0 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
2f7f0 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
2f800 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
2f810 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
2f820 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2f830 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
2f840 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
2f850 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65     iDocid += iDe
2f860 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
2f870 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f880 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f890 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2f8a0 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iDocid);.    }. 
2f8b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66   }..  return iOf
2f8c0 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
2f8d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72   function is par
2f8e0 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2f8f0 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2f900 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
2f910 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75   .** only ever u
2f920 73 65 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d  sed with detail=
2f930 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  none tables..**.
2f940 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61 74 61  ** Buffer (pData
2f950 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73  /nData) contains
2f960 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68   a doclist in th
2f970 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79  e format used by
2f980 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20   detail=none.** 
2f990 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e  tables. This fun
2f9a0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2f9b0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76  human-readable v
2f9c0 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c  ersion of that l
2f9d0 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72  ist to.** buffer
2f9e0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pBuf..**.** If 
2f9f0 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68  *pRc is other th
2fa00 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
2fa10 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2fa20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2fa30 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20   a.** no-op. If 
2fa40 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20  an OOM or other 
2fa50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
2fa60 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
2fa70 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65  n, *pRc is.** se
2fa80 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  t to an SQLite e
2fa90 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65  rror code before
2faa0 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20   returning. The 
2fab0 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62  final state of b
2fac0 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73  uffer.** pBuf is
2fad0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2fae0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
2faf0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2fb00 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69  deRowidList(.  i
2fb10 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fb30 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
2fb40 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2fb50 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20  ffer *pBuf,     
2fb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
2fb70 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65  fer to append te
2fb80 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74  xt to */.  const
2fb90 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
2fba0 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61  nData      /* Da
2fbb0 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73  ta to decode lis
2fbc0 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d  t-of-rowids from
2fbd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d   */.){.  int i =
2fbe0 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
2fbf0 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
2fc00 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63  i<nData ){.    c
2fc10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20  onst char *zApp 
2fc20 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56  = "";.    u64 iV
2fc30 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  al;.    i += sql
2fc40 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2fc50 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56  t(&pData[i], &iV
2fc60 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  al);.    iRowid 
2fc70 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66  += iVal;..    if
2fc80 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2fc90 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2fca0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
2fcb0 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70  if( i<nData && p
2fcc0 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b  Data[i]==0x00 ){
2fcd0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
2fce0 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22        zApp = "+"
2fcf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fd00 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a         zApp = "*
2fd10 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
2fd20 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
2fd30 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2fd40 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2fd50 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64   %lld%s", iRowid
2fd60 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  , zApp);.  }.}..
2fd70 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2fd80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2fd90 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2fda0 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65  function fts5_de
2fdb0 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
2fdc0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2fdd0 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  eFunction(.  sql
2fde0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2fdf0 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
2fe00 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f  Function call co
2fe10 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
2fe20 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
2fe30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2fe40 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c  mber of args (al
2fe50 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c  ways 2) */.  sql
2fe60 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
2fe70 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
2fe80 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  Function argumen
2fe90 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69  ts */.){.  i64 i
2fea0 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
2feb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2fec0 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62  wid for record b
2fed0 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
2fee0 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65    int iSegid,iHe
2fef0 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64  ight,iPgno,bDlid
2ff00 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f  x;/* Rowid compo
2ff10 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  nents */.  const
2ff20 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20   u8 *aBlob; int 
2ff30 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  n;         /* Re
2ff40 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a  cord to decode *
2ff50 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20  /.  u8 *a = 0;. 
2ff60 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20   Fts5Buffer s;  
2ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff80 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78   /* Build up tex
2ff90 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65  t to return here
2ffa0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2ffb0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ffc0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ffd0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  code */.  int nS
2ffe0 70 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pace = 0;.  int 
2fff0 65 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73  eDetailNone = (s
30000 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
30010 28 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61  (pCtx)!=0);..  a
30020 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
30030 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
30040 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74  (nArg);.  memset
30050 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
30060 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
30070 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
30080 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
30090 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  l[0]);..  /* Mak
300a0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
300b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
300c0 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f  (a blob) in aBlo
300d0 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d  b[]. The aBlob[]
300e0 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f  .  ** copy is fo
300f0 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44  llowed by FTS5_D
30100 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
30110 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69   0x00 bytes, whi
30120 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a  ch prevents.  **
30130 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
30140 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65  s even if the re
30150 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e  cord is corrupt.
30160 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74    */.  n = sqlit
30170 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
30180 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f  pVal[1]);.  aBlo
30190 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
301a0 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29  e_blob(apVal[1])
301b0 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b  ;.  nSpace = n +
301c0 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
301d0 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28  PADDING;.  a = (
301e0 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  u8*)sqlite3Fts5M
301f0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
30200 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d  Space);.  if( a=
30210 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65  =0 ) goto decode
30220 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61  _out;.  memcpy(a
30230 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20  , aBlob, n);... 
30240 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
30250 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64  (iRowid, &iSegid
30260 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
30270 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
30280 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
30290 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
302a0 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29  ;.  if( bDlidx )
302b0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64  {.    Fts5Data d
302c0 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c  lidx;.    Fts5Dl
302d0 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20  idxLvl lvl;..   
302e0 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20   dlidx.p = a;.  
302f0 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a    dlidx.nn = n;.
30300 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c  .    memset(&lvl
30310 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
30320 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
30330 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69  lvl.pData = &dli
30340 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61  dx;.    lvl.iLea
30350 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a  fPgno = iPgno;..
30360 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64      for(fts5Dlid
30370 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20  xLvlNext(&lvl); 
30380 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73  lvl.bEof==0; fts
30390 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
303a0 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  vl)){.      sqli
303b0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
303c0 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26  endPrintf(&rc, &
303d0 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20  s, .          " 
303e0 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69  %d(%lld)", lvl.i
303f0 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52  LeafPgno, lvl.iR
30400 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  owid.      );.  
30410 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
30420 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
30430 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53   if( iRowid==FTS
30440 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
30450 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65   ){.      fts5De
30460 63 6f 64 65 41 76 65 72 61 67 65 73 28 26 72 63  codeAverages(&rc
30470 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20  , &s, a, n);.   
30480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
30490 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
304a0 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  e(&rc, &s, a, n)
304b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
304c0 69 66 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20  if( eDetailNone 
304d0 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  ){.    Fts5Buffe
304e0 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
304f0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
30500 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
30510 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
30520 7a 4c 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69  zLeaf;.    int i
30530 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61  PgidxOff = szLea
30540 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
30550 61 5b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69  a[2]);.    int i
30560 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74  TermOff;.    int
30570 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
30580 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d  int iOff;..    m
30590 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
305a0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
305b0 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  r));..    /* Dec
305c0 6f 64 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ode any entries 
305d0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
305e0 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
305f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c  . */.    if( szL
30600 65 61 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  eaf<n ){.      i
30610 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
30620 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30630 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
30640 4f 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Off);.    }else{
30650 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20  .      iTermOff 
30660 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
30670 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f      fts5DecodeRo
30680 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c  widList(&rc, &s,
30690 20 26 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66   &a[4], iTermOff
306a0 2d 34 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d  -4);..    iOff =
306b0 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77   iTermOff;.    w
306c0 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61  hile( iOff<szLea
306d0 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  f ){.      int n
306e0 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f  Append;..      /
306f0 2a 20 52 65 61 64 20 74 68 65 20 74 65 72 6d 20  * Read the term 
30700 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78  data for the nex
30710 74 20 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69  t term*/.      i
30720 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
30730 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
30740 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20   nAppend);.     
30750 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b   term.n = nKeep;
30760 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
30770 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
30780 20 26 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c   &term, nAppend,
30790 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
307a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
307b0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
307c0 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20  .          &rc, 
307d0 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22  &s, " term=%.*s"
307e0 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74  , term.n, (const
307f0 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20   char*)term.p.  
30800 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66      );.      iOf
30810 66 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20  f += nAppend;.. 
30820 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
30830 75 74 20 77 68 65 72 65 20 74 68 65 20 64 6f 63  ut where the doc
30840 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
30850 72 6d 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20  rm ends */.     
30860 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
30870 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
30880 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69  nIncr;.        i
30890 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
308a0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
308b0 50 67 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72  PgidxOff], nIncr
308c0 29 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d  );.        iTerm
308d0 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20  Off += nIncr;.  
308e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
308f0 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a     iTermOff = sz
30900 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
30910 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52       fts5DecodeR
30920 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73  owidList(&rc, &s
30930 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72  , &a[iOff], iTer
30940 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20  mOff-iOff);.    
30950 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
30960 66 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  f;.      if( iOf
30970 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  f<szLeaf ){.    
30980 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
30990 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
309a0 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
309b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
309c0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
309d0 26 74 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  &term);.  }else{
309e0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
309f0 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
30a00 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65     /* Current te
30a10 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67  rm read from pag
30a20 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  e */.    int szL
30a30 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
30a40 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
30a50 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d   of pgidx in a[]
30a60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69   */.    int iPgi
30a70 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69  dxOff;.    int i
30a80 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20  PgidxPrev = 0;  
30a90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
30aa0 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64 20  ious value read 
30ab0 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20  from pgidx */.  
30ac0 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
30ad0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77   0;.    int iRow
30ae0 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  idOff = 0;.    i
30af0 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
30b00 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20   nDoclist;..    
30b10 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
30b20 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
30b30 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  er));..    if( n
30b40 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <4 ){.      sqli
30b50 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
30b60 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f  (&rc, &s, 7, (co
30b70 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74  nst u8*)"corrupt
30b80 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  ");.      goto d
30b90 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ecode_out;.    }
30ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77  else{.      iRow
30bb0 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
30bc0 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20  16(&a[0]);.     
30bd0 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c   iPgidxOff = szL
30be0 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
30bf0 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[2]);.      i
30c00 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
30c10 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65  {.        fts5Ge
30c20 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
30c30 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66  idxOff], iTermOf
30c40 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
30c50 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
30c60 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
30c70 73 74 20 74 61 69 6c 20 61 74 20 74 68 65 20 73  st tail at the s
30c80 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
30c90 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77   */.    if( iRow
30ca0 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20  idOff!=0 ){.    
30cb0 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f    iOff = iRowidO
30cc0 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ff;.    }else if
30cd0 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b  ( iTermOff!=0 ){
30ce0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
30cf0 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  ermOff;.    }els
30d00 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  e{.      iOff = 
30d10 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
30d20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c    fts5DecodePosl
30d30 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
30d40 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20  4], iOff-4);..  
30d50 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20    /* Decode any 
30d60 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74  more doclist dat
30d70 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  a that appears o
30d80 6e 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72  n the page befor
30d90 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  e the.    ** fir
30da0 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
30db0 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72  nDoclist = (iTer
30dc0 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20  mOff ? iTermOff 
30dd0 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66  : szLeaf) - iOff
30de0 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65  ;.    fts5Decode
30df0 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Doclist(&rc, &s,
30e00 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c   &a[iOff], nDocl
30e10 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65  ist);..    while
30e20 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
30e30 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73  .      int bFirs
30e40 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d  t = (iPgidxOff==
30e50 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20  szLeaf);     /* 
30e60 54 72 75 65 20 66 6f 72 20 66 69 72 73 74 20 74  True for first t
30e70 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  erm on page */. 
30e80 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20       int nByte; 
30e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
30eb0 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  tes of data */. 
30ec0 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20       int iEnd;. 
30ed0 20 20 20 20 20 0a 20 20 20 20 20 20 69 50 67 69       .      iPgi
30ee0 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
30ef0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
30f00 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  dxOff], nByte);.
30f10 20 20 20 20 20 20 69 50 67 69 64 78 50 72 65 76        iPgidxPrev
30f20 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20   += nByte;.     
30f30 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72   iOff = iPgidxPr
30f40 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  ev;..      if( i
30f50 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20  PgidxOff<n ){.  
30f60 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72        fts5GetVar
30f70 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
30f80 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
30f90 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69       iEnd = iPgi
30fa0 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a  dxPrev + nByte;.
30fb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30fc0 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65       iEnd = szLe
30fd0 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  af;.      }..   
30fe0 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30     if( bFirst==0
30ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
31000 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
31010 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
31020 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  yte);.        te
31030 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  rm.n = nByte;.  
31040 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66      }.      iOff
31050 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
31060 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
31070 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  yte);.      fts5
31080 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
31090 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
310a0 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
310b0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79       iOff += nBy
310c0 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  te;..      sqlit
310d0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
310e0 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
310f0 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
31100 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
31110 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
31120 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
31130 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
31140 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
31150 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
31160 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20  ], iEnd-iOff);. 
31170 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
31180 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
31190 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f  .  }.  . decode_
311a0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
311b0 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63  ree(a);.  if( rc
311c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
311d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
311e0 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f  t_text(pCtx, (co
311f0 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73  nst char*)s.p, s
31200 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  .n, SQLITE_TRANS
31210 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
31220 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31230 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
31240 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66  tx, rc);.  }.  f
31250 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73  ts5BufferFree(&s
31260 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
31270 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
31280 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
31290 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
312a0 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a  ts5_rowid()..*/.
312b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
312c0 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  RowidFunction(. 
312d0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
312e0 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
312f0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
31300 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
31310 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
31320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31330 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
31340 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20   (always 2) */. 
31350 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
31360 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
31370 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
31380 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
31390 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
313a0 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
313b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
313c0 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
313d0 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
313e0 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c  5_rowid(subject,
313f0 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20   ....)", -1);.  
31400 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20  }else{.    zArg 
31410 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
31420 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
31430 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  t(apVal[0]);.   
31440 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
31450 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73  stricmp(zArg, "s
31460 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  egment") ){.    
31470 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
31480 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70      int segid, p
31490 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gno;.      if( n
314a0 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
314b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
314c0 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
314d0 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
314e0 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
314f0 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69  ('segment', segi
31500 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20  d, pgno))", -1. 
31510 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
31520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
31530 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  egid = sqlite3_v
31540 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31  alue_int(apVal[1
31550 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f  ]);.        pgno
31560 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
31570 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a  _int(apVal[2]);.
31580 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
31590 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
315a0 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29  WID(segid, pgno)
315b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
315c0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
315d0 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
315e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
315f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
31600 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
31610 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73  , .        "firs
31620 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f  t arg to fts5_ro
31630 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73  wid() must be 's
31640 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20  egment'" , -1.  
31650 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
31660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
31670 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
31680 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20   of registering 
31690 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20  the FTS5 module 
316a0 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a  with database.**
316b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20   connection db. 
316c0 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76  It registers sev
316d0 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65  eral user-define
316e0 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
316f0 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74  ns useful.** wit
31700 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66  h FTS5..**.** If
31710 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
31720 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
31730 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
31740 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68  occurs, some oth
31750 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  er.** SQLite err
31760 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
31770 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
31780 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
31790 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33  ndexInit(sqlite3
317a0 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
317b0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
317c0 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
317d0 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64   db, "fts5_decod
317e0 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e", 2, SQLITE_UT
317f0 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64  F8, 0, fts5Decod
31800 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  eFunction, 0, 0.
31810 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
31820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
31840 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
31850 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
31860 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32  _decode_none", 2
31870 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  , .        SQLIT
31880 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 64  E_UTF8, (void*)d
31890 62 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  b, fts5DecodeFun
318a0 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
318b0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
318c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
318d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
318e0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
318f0 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
31900 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53  s5_rowid", -1, S
31910 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
31920 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
31930 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
31940 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
31950 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
31960 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74 73  s5IndexReset(Fts
31970 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
31980 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74  sert( p->pStruct
31990 3d 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63  ==0 || p->iStruc
319a0 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20  tVersion!=0 );. 
319b0 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 44 61   if( fts5IndexDa
319c0 74 61 56 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d  taVersion(p)!=p-
319d0 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20  >iStructVersion 
319e0 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  ){.    fts5Struc
319f0 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
31a00 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
31a10 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
31a20 70 29 3b 0a 7d 0a                                p);.}.