/ Hex Artifact Content
Login

Artifact 578f46697080f11a1e26cd45a1c039c043a3111d:


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: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
28e0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2900: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2910: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2920: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2940: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2950: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2960: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65  */.  int bDelete
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2980: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2990: 77 72 69 74 65 20 69 73 20 61 20 64 65 6c 65 74  write is a delet
29a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  e */..  /* Error
29b0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
29c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
29f0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2a00: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2a10: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2a20: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2a30: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2a40: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2a50: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2a60: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2a80: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2a90: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2aa0: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2ab0: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2ac0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2ad0: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2ae0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2af0: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2b00: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73  ND id<=?" */.  s
2b10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2b20: 78 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f  xWriter;       /
2b30: 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f  * "INSERT ... %_
2b40: 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  idx VALUES(?,?,?
2b50: 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ,?)" */.  sqlite
2b60: 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65  3_stmt *pIdxDele
2b70: 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45  ter;      /* "DE
2b80: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20  LETE FROM %_idx 
2b90: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f  WHERE segid=? */
2ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2bb0: 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69  *pIdxSelect;.  i
2bc0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2be0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2bf0: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2c00: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2c10: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2c20: 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20  u8 *aEof;       
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
2c50: 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
2c60: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f   doclist */..  /
2c70: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
2c80: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
2c90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
2ca0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
2cb0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
2cc0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53  oslist;.  int nS
2cd0: 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.};../*.** T
2ce0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
2d00: 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69  ecord for each i
2d10: 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65  ndex are represe
2d20: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e  nted.** using an
2d30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72   Fts5Structure r
2d40: 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e  ecord in memory.
2d50: 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74   Which uses inst
2d60: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a  ances of the .**
2d70: 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63   other Fts5Struc
2d80: 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73  tureXXX types as
2d90: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a   components..*/.
2da0: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2db0: 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20  tureSegment {.  
2dc0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
2df0: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e30: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
2e40: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
2e70: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
2e80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2e90: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2ea0: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed0: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
2ee0: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
2ef0: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f10: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f20: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
2f30: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
2f40: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
2f50: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
2f60: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
2f70: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
2f80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2f90: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
2fa0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65  /* Object refere
2fd0: 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75  nce count */.  u
2fe0: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3000: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3010: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3020: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  0 */.  int nSegm
3030: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3040: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3050: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  segments in this
3060: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3070: 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20  int nLevel;     
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76  /* Number of lev
30a0: 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  els in this inde
30b0: 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
30c0: 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c  tureLevel aLevel
30d0: 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  [1];   /* Array 
30e0: 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20  of nLevel level 
30f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3100: 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
3110: 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72  f type Fts5SegWr
3120: 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  iter is used to 
3130: 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74  write to segment
3140: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3150: 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20  5PageWriter {.  
3160: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
3190: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
31a0: 20 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78    int iPrevPgidx
31b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
31d0: 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lue written into
31e0: 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35   pgidx */.  Fts5
31f0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3220: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
3230: 46 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78  Fts5Buffer pgidx
3240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3250: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3260: 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20  ning page-index 
3270: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3280: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
3290: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
32a0: 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
32b0: 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  us term on page 
32c0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32d0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20  5DlidxWriter {. 
32e0: 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20   int pgno;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3310: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
3320: 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69  .  int bPrevVali
3330: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3340: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50     /* True if iP
3350: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3360: 20 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20    i64 iPrev;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3390: 77 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65  wid value writte
33a0: 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46  n to page */.  F
33b0: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
33e0: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
33f0: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53  .};.struct Fts5S
3400: 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74  egWriter {.  int
3410: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3440: 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  o */.  Fts5PageW
3450: 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
3460: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72         /* PageWr
3470: 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
3480: 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b   i64 iPrevRowid;
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
34b0: 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75  id written to cu
34c0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
34d0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
34e0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
34f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3500: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
3510: 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75  n doclist */.  u
3520: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  8 bFirstRowidInP
3530: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
3540: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3550: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3560: 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f   page */.  /* TO
3570: 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72  DO1: Can use (wr
3580: 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29  iter.pgidx.n==0)
3590: 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72   instead of bFir
35a0: 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a  stTermInPage */.
35b0: 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49    u8 bFirstTermI
35c0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
35d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
35e0: 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66  t term will be f
35f0: 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a  irst in leaf */.
3600: 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74    int nLeafWritt
3610: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3620: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3630: 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
3640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74  n */.  int nEmpt
3650: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
3660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3670: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74   of contiguous t
3680: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a  erm-less nodes *
3690: 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b  /..  int nDlidx;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
36c0: 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78  d size of aDlidx
36d0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
36e0: 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
36f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  Dlidx;        /*
3700: 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c   Array of Fts5Dl
3710: 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74  idxWriter object
3720: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65  s */..  /* Value
3730: 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  s to insert into
3740: 20 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65   the %_idx table
3750: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
3760: 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20   btterm;        
3770: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65        /* Next te
3780: 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rm to insert int
3790: 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f  o %_idx table */
37a0: 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20  .  int iBtPage; 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37d0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
37e0: 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a  to btterm */.};.
37f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3800: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3810: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3820: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3830: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3860: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3870: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3880: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
38a0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
38b0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
38c0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
38d0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
38e0: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
38f0: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
3900: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a  ch term/rowid.**
3910: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
3920: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
3930: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
3940: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
3950: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
3960: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
3970: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
3980: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
3990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
39a0: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
39b0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
39c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
39d0: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69  f that is the fi
39e0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
39f0: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3a00: 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79  ist data (one by
3a10: 74 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f  te passed the po
3a20: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
3a30: 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f   field)..**   ro
3a40: 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  wid field of the
3a50: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
3a60: 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20  Usually this is 
3a70: 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f  the size field o
3a80: 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74  f the.**   posit
3a90: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54  ion list data. T
3aa0: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3ab0: 69 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  if the rowid for
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
3ad0: 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20  ry .**   is the 
3ae0: 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68  last thing on th
3af0: 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a  e leaf page..**.
3b00: 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42  ** pLeaf:.**   B
3b10: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3b20: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
3b30: 67 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20  ge data. Set to 
3b40: 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  NULL at EOF..**.
3b50: 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  ** iTermLeafPgno
3b60: 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  , iTermLeafOffse
3b70: 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67  t:.**   Leaf pag
3b80: 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e  e number contain
3b90: 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72  ing the last ter
3ba0: 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  m read from the 
3bb0: 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20  segment. And.** 
3bc0: 20 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d    the offset imm
3bd0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
3be0: 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  ng the term data
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a  ..**.** flags:.*
3c00: 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35  *   Mask of FTS5
3c10: 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c  _SEGITER_XXX val
3c20: 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64  ues. Interpreted
3c30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3c40: 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45  **   FTS5_SEGITE
3c50: 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20  R_ONETERM:.**   
3c60: 20 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68    If set, set th
3c70: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
3c80: 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72  int to EOF after
3c90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
3ca0: 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73  list .**     has
3cb0: 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
3cc0: 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
3cd0: 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  to the next term
3ce0: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3cf0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
3d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a  GITER_REVERSE:.*
3d10: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
3d20: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74  is only ever set
3d30: 20 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52   if FTS5_SEGITER
3d40: 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f  _ONETERM is also
3d50: 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20   set. If.**     
3d60: 69 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61  it is set, itera
3d70: 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64  te through rowid
3d80: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
3d90: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
3da0: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
3db0: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
3dc0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
3dd0: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
3de0: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
3df0: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
3e00: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
3e10: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
3e20: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
3e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65  .**.**     For e
3e40: 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ach rowid on the
3e50: 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64   page correspond
3e60: 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
3e70: 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20  nt term, the.** 
3e80: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
3e90: 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  g aRowidOffset[]
3ea0: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
3eb0: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
3ec0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   of the.**     s
3ed0: 74 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73  tart of the "pos
3ee0: 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22  ition-list-size"
3ef0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
3f00: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54  e page..**.** iT
3f10: 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49  ermIdx:.**     I
3f20: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
3f30: 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61  term on iTermLea
3f40: 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74  fPgno..*/.struct
3f50: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
3f60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3f70: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
3f80: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
3f90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
3fa0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
3fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
3fe0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
3ff0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4000: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4010: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4020: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4030: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4050: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4060: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
4070: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
4080: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
4090: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
40a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
40b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
40c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
40d0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
40e0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
40f0: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4100: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4110: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4120: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4130: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4140: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4150: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4160: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4170: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4180: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4190: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
41a0: 74 3b 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78  t;..  int iPgidx
41b0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
41c0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
41d0: 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f  fset in pgidx */
41e0: 0a 20 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63  .  int iEndofDoc
41f0: 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  list;..  /* The 
4200: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e  following are on
4210: 6c 79 20 75 73 65 64 20 69 66 20 74 68 65 20 46  ly used if the F
4220: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4230: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
4240: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
4250: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4260: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4270: 20 65 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64   entry in aRowid
4280: 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e  Offset[] */.  in
4290: 74 20 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t nRowidOffset; 
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42b0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
42c0: 6f 66 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  of aRowidOffset[
42d0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
42e0: 20 2a 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20   *aRowidOffset; 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4300: 41 72 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20  Array of offset 
4310: 74 6f 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20  to rowid fields 
4320: 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49  */..  Fts5DlidxI
4330: 74 65 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20  ter *pDlidx;    
4340: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
4350: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
4360: 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61  ndex */..  /* Va
4370: 72 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65  riables populate
4380: 64 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65  d based on curre
4390: 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46  nt entry. */.  F
43a0: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43c0: 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
43d0: 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  /.  i64 iRowid; 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
4400: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  owid */.  int nP
4410: 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
4420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4430: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4440: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
4450: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62   list */.  int b
4460: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
4470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4480: 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65  ue if the delete
4490: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
44a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  };../*.** Argume
44b0: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
44c0: 74 6f 20 61 6e 20 46 74 73 35 44 61 74 61 20 73  to an Fts5Data s
44d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
44e0: 6e 74 61 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61  ntains a .** lea
44f0: 66 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69  f page..*/.#defi
4500: 6e 65 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  ne ASSERT_SZLEAF
4510: 5f 4f 4b 28 78 29 20 61 73 73 65 72 74 28 20 5c  _OK(x) assert( \
4520: 0a 20 20 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66  .    (x)->szLeaf
4530: 3d 3d 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28 78 29  ==(x)->nn || (x)
4540: 2d 3e 73 7a 4c 65 61 66 3d 3d 66 74 73 35 47 65  ->szLeaf==fts5Ge
4550: 74 55 31 36 28 26 28 78 29 2d 3e 70 5b 32 5d 29  tU16(&(x)->p[2])
4560: 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65 20 46 54   \.)..#define FT
4570: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
4580: 52 4d 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20  RM 0x01.#define 
4590: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
45a0: 45 52 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a  ERSE 0x02.../* .
45b0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61  ** Argument is a
45c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46   pointer to an F
45d0: 74 73 35 44 61 74 61 20 73 74 72 75 63 74 75 72  ts5Data structur
45e0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
45f0: 61 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20  a leaf.** page. 
4600: 54 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75  This macro evalu
4610: 61 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20  ates to true if 
4620: 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
4630: 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a  s no terms, or.*
4640: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 63 6f  * false if it co
4650: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
4660: 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65  one term..*/.#de
4670: 66 69 6e 65 20 66 74 73 35 4c 65 61 66 49 73 54  fine fts5LeafIsT
4680: 65 72 6d 6c 65 73 73 28 78 29 20 28 28 78 29 2d  ermless(x) ((x)-
4690: 3e 73 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e  >szLeaf >= (x)->
46a0: 6e 6e 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  nn)..#define fts
46b0: 35 4c 65 61 66 54 65 72 6d 4f 66 66 28 78 2c 20  5LeafTermOff(x, 
46c0: 69 29 20 28 66 74 73 35 47 65 74 55 31 36 28 26  i) (fts5GetU16(&
46d0: 28 78 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65  (x)->p[(x)->szLe
46e0: 61 66 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a 23  af + (i)*2]))..#
46f0: 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66 46  define fts5LeafF
4700: 69 72 73 74 52 6f 77 69 64 4f 66 66 28 78 29 20  irstRowidOff(x) 
4710: 28 66 74 73 35 47 65 74 55 31 36 28 28 78 29 2d  (fts5GetU16((x)-
4720: 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  >p))../*.** Obje
4730: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
4740: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72   through the mer
4750: 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f  ged results of o
4760: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
4770: 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67  nts,.** visiting
4780: 20 65 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64   each term/rowid
4790: 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72   pair in the mer
47a0: 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ged data..**.** 
47b0: 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61  nSeg is always a
47c0: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72   power of two gr
47d0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
47e0: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
47f0: 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  r of.** segments
4800: 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63   that this objec
4810: 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74  t is merging dat
4820: 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65  a from. Both the
4830: 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61   aSeg[] and.** a
4840: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61  First[] arrays a
4850: 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67  re sized at nSeg
4860: 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53   entries. The aS
4870: 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61  eg[] array is pa
4880: 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72  dded.** with zer
4890: 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68  oed objects - th
48a0: 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ese are handled 
48b0: 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20  as if they were 
48c0: 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64  iterators opened
48d0: 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67  .** on empty seg
48e0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
48f0: 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
4900: 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61  aring segments a
4910: 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b  Seg[N] and aSeg[
4920: 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73  N+1], where N is
4930: 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62   an.** even numb
4940: 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  er, is stored in
4950: 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29   aFirst[(nSeg+N)
4960: 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74  /2]. The "result
4970: 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d  " of the .** com
4980: 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20  parison in this 
4990: 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69  context is the i
49a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72  ndex of the iter
49b0: 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e  ator that curren
49c0: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
49d0: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72   the smaller ter
49e0: 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  m/rowid combinat
49f0: 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61  ion. Iterators a
4a00: 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e  t EOF are.** con
4a10: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72  sidered to be gr
4a20: 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f  eater than all o
4a30: 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a  ther iterators..
4a40: 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20  **.** aFirst[1] 
4a50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
4a60: 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20  ex in aSeg[] of 
4a70: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
4a80: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
4a90: 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
4aa0: 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b  overall. aFirst[
4ab0: 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a  0] is unused. .*
4ac0: 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a 2a  *.** poslist:.**
4ad0: 20 20 20 55 73 65 64 20 62 79 20 73 71 6c 69 74     Used by sqlit
4ae0: 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
4af0: 74 28 29 20 77 68 65 6e 20 74 68 65 20 70 6f 73  t() when the pos
4b00: 6c 69 73 74 20 6e 65 65 64 73 20 74 6f 20 62 65  list needs to be
4b10: 20 62 75 66 66 65 72 65 64 2e 0a 2a 2a 20 20 20   buffered..**   
4b20: 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  There is no way 
4b30: 74 6f 20 74 65 6c 6c 20 69 66 20 74 68 69 73 20  to tell if this 
4b40: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 20  is populated or 
4b50: 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  not..*/.struct F
4b60: 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b 0a 20  ts5IndexIter {. 
4b70: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64   Fts5Index *pInd
4b80: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
4b90: 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20 6f   /* Index that o
4ba0: 77 6e 73 20 74 68 69 73 20 69 74 65 72 61 74 6f  wns this iterato
4bb0: 72 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  r */.  Fts5Struc
4bc0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20  ture *pStruct;  
4bd0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4be0: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
4bf0: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a   this iterator *
4c00: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  /.  Fts5Buffer p
4c10: 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oslist;         
4c20: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
4c30: 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74  ntaining current
4c40: 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20 69   poslist */..  i
4c50: 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20  nt nSeg;        
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c70: 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d  * Size of aSeg[]
4c80: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
4c90: 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4cb0: 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20 69  rue to iterate i
4cc0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
4cd0: 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70  */.  u8 bSkipEmp
4ce0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
4cf0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
4d00: 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74  skip deleted ent
4d10: 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f  ries */.  u8 bEo
4d20: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
4d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d40: 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 75 38  e at EOF */.  u8
4d50: 20 62 46 69 6c 74 65 72 65 64 3b 20 20 20 20 20   bFiltered;     
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 2d   True if column-
4d80: 66 69 6c 74 65 72 20 61 6c 72 65 61 64 79 20 61  filter already a
4d90: 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 69 36 34  pplied */..  i64
4da0: 20 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20   iSwitchRowid;  
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4dc0: 46 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f  Firstest rowid o
4dd0: 66 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69  f other than aFi
4de0: 72 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35  rst[1] */.  Fts5
4df0: 43 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b  CResult *aFirst;
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4e10: 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61  urrent merge sta
4e20: 74 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a  te (see above) *
4e30: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
4e40: 61 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20  aSeg[1];        
4e50: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4e60: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
4e70: 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.};.../*.** 
4e80: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4e90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
4ea0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65  e is used to ite
4eb0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
4ec0: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
4ed0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
4ee0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44  record..**.** pD
4ef0: 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64  ata:.**   Record
4f00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4f10: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61  doclist-index da
4f20: 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a  ta..**.** bEof:.
4f30: 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65  **   Set to true
4f40: 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68   once iterator h
4f50: 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a  as reached EOF..
4f60: 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20  **.** iOff:.**  
4f70: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72   Set to the curr
4f80: 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69  ent offset withi
4f90: 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a  n record pData..
4fa0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c  */.struct Fts5Dl
4fb0: 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44  idxLvl {.  Fts5D
4fc0: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
4fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4fe0: 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67   for current pag
4ff0: 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20  e of this level 
5000: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20  */.  int iOff;  
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
5030: 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20  fset into pData 
5040: 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20  */.  int bEof;  
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72     /* At EOF alr
5070: 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46  eady */.  int iF
5080: 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20  irstOff;        
5090: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
50a0: 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61  by reverse itera
50b0: 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  tors */..  /* Ou
50c0: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a  tput variables *
50d0: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
50e0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
50f0: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
5100: 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66   of current leaf
5110: 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69   page */.  i64 i
5120: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
5130: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5140: 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20  t rowid on leaf 
5150: 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a  iLeafPgno */.};.
5160: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
5170: 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76  Iter {.  int nLv
5180: 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  l;.  int iSegid;
5190: 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  .  Fts5DlidxLvl 
51a0: 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61  aLvl[1];.};..sta
51b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74  tic void fts5Put
51c0: 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31  U16(u8 *aOut, u1
51d0: 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b  6 iVal){.  aOut[
51e0: 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a  0] = (iVal>>8);.
51f0: 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61    aOut[1] = (iVa
5200: 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74  l&0xFF);.}..stat
5210: 69 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31  ic u16 fts5GetU1
5220: 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29  6(const u8 *aIn)
5230: 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36  {.  return ((u16
5240: 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20  )aIn[0] << 8) + 
5250: 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a  aIn[1];.} ../*.*
5260: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
5270: 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61  eturn a buffer a
5280: 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79  t least nByte by
5290: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
52a0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
52b0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
52c0: 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  d, return NULL a
52d0: 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  nd set the error
52e0: 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20   code in.** the 
52f0: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
5300: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
5310: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
5320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66  /.static void *f
5330: 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73  ts5IdxMalloc(Fts
5340: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e  5Index *p, int n
5350: 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Byte){.  return 
5360: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
5370: 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
5380: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  yte);.}../*.** C
5390: 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
53a0: 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74  nts of the pLeft
53b0: 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65   buffer with the
53c0: 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62   pRight/nRight b
53d0: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lob..**.** Retur
53e0: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
53f0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5400: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
5410: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
5420: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
5430: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5440: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
5450: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
5460: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
5470: 70 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66  pRight.*/.#ifdef
5480: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
5490: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
54a0: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a  ferCompareBlob(.
54b0: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c    Fts5Buffer *pL
54c0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
54d0: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
54e0: 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ide of compariso
54f0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
5500: 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69  *pRight, int nRi
5510: 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ght    /* Right 
5520: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d  hand side of com
5530: 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  parison */.){.  
5540: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
5550: 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29  Left->n, nRight)
5560: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
5570: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
5580: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
5590: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
55a0: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69   (pLeft->n - nRi
55b0: 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23  ght) : res);.}.#
55c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  endif../*.** Com
55d0: 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
55e0: 73 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66  s of the two buf
55f0: 66 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d  fers using memcm
5600: 70 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66  p(). If one buff
5610: 65 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69  er.** is a prefi
5620: 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
5630: 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  it is considered
5640: 20 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a   the lesser..**.
5650: 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66  ** Return -ve if
5660: 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65   pLeft is smalle
5670: 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30  r than pRight, 0
5680: 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75   if they are equ
5690: 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20  al or.** +ve if 
56a0: 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65  pRight is smalle
56b0: 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e  r than pLeft. In
56c0: 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a   other words:.**
56d0: 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70  .**     res = *p
56e0: 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a  Left - *pRight.*
56f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5700: 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46  5BufferCompare(F
5710: 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74  ts5Buffer *pLeft
5720: 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 52  , Fts5Buffer *pR
5730: 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d  ight){.  int nCm
5740: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5750: 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20  , pRight->n);.  
5760: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
5770: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5780: 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  t->p, nCmp);.  r
5790: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
57a0: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67  (pLeft->n - pRig
57b0: 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d  ht->n) : res);.}
57c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
57d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
57e0: 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65   fts5BlobCompare
57f0: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  (.  const u8 *pL
5800: 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20  eft, int nLeft, 
5810: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5820: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a  ght, int nRight.
5830: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
5840: 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68  MIN(nLeft, nRigh
5850: 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  t);.  int res = 
5860: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52  memcmp(pLeft, pR
5870: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
5880: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
5890: 28 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29  (nLeft - nRight)
58a0: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
58b0: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  f..static int ft
58c0: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
58d0: 66 66 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65  ff(Fts5Data *pLe
58e0: 61 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a  af){.  int ret;.
58f0: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33    fts5GetVarint3
5900: 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61  2(&pLeaf->p[pLea
5910: 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29  f->szLeaf], ret)
5920: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
5930: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
5940: 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f  he read-only blo
5950: 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20  b handle, if it 
5960: 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  is open..*/.stat
5970: 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73  ic void fts5Clos
5980: 65 52 65 61 64 65 72 28 46 74 73 35 49 6e 64 65  eReader(Fts5Inde
5990: 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  x *p){.  if( p->
59a0: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73  pReader ){.    s
59b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65  qlite3_blob *pRe
59c0: 61 64 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65  ader = p->pReade
59d0: 72 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65  r;.    p->pReade
59e0: 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
59f0: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52  e3_blob_close(pR
5a00: 65 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eader);.  }.}...
5a10: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
5a20: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
5a30: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
5a40: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5a50: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
5a60: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
5a70: 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74   error left in t
5a80: 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  he .** Fts5Index
5a90: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
5aa0: 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73  ic Fts5Data *fts
5ab0: 35 44 61 74 61 52 65 61 64 28 46 74 73 35 49 6e  5DataRead(Fts5In
5ac0: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
5ad0: 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  id){.  Fts5Data 
5ae0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
5af0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
5b00: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  K ){.    int rc 
5b10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
5b20: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5b30: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
5b40: 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72  s call may retur
5b50: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69  n SQLITE_ABORT i
5b60: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
5b70: 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20   a savepoint.   
5b80: 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73     ** rollback s
5b90: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
5ba0: 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63   used. In this c
5bb0: 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68  ase a new blob h
5bc0: 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69  andle.      ** i
5bd0: 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
5be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
5bf0: 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  ob *pBlob = p->p
5c00: 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d  Reader;.      p-
5c10: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
5c20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5c30: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c  _blob_reopen(pBl
5c40: 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  ob, iRowid);.   
5c50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
5c60: 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
5c70: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70    p->pReader = p
5c80: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20  Blob;.      if( 
5c90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5ca0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f  .        fts5Clo
5cb0: 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
5cc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
5cd0: 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  c==SQLITE_ABORT 
5ce0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
5cf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d00: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
5d10: 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61  le is not open a
5d20: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70  t this point, op
5d30: 65 6e 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a  en it and seek .
5d40: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65      ** to the re
5d50: 71 75 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20  quested entry.  
5d60: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  */.    if( p->pR
5d70: 65 61 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d  eader==0 && rc==
5d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5d90: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
5da0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
5db0: 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  fig;.      rc = 
5dc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
5dd0: 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a  n(pConfig->db, .
5de0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
5df0: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
5e00: 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52  Tbl, "block", iR
5e10: 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65  owid, 0, &p->pRe
5e20: 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20  ader.      );.  
5e30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
5e40: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c  ither of the sql
5e50: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29  ite3_blob_open()
5e60: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62   or sqlite3_blob
5e70: 5f 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a  _reopen() calls.
5e80: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74      ** above ret
5e90: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52  urned SQLITE_ERR
5ea0: 4f 52 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  OR, return SQLIT
5eb0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69  E_CORRUPT_VTAB i
5ec0: 6e 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41  nstead..    ** A
5ed0: 6c 6c 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74  ll the reasons t
5ee0: 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d  hose functions m
5ef0: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
5f00: 54 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69  TE_ERROR - missi
5f10: 6e 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c  ng.    ** table,
5f20: 20 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f   missing row, no
5f30: 6e 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62  n-blob/text in b
5f40: 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e  lock column - in
5f50: 64 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62  dicate .    ** b
5f60: 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72  acking store cor
5f70: 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
5f80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5f90: 45 52 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53  ERROR ) rc = FTS
5fa0: 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
5fb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5fc0: 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  K ){.      u8 *a
5fd0: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
5fe0: 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62         /* Read b
5ff0: 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68  lob data into th
6000: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  is buffer */.   
6010: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
6020: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
6030: 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20  s(p->pReader);. 
6040: 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20       int nAlloc 
6050: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  = sizeof(Fts5Dat
6060: 61 29 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53  a) + nByte + FTS
6070: 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a  5_DATA_PADDING;.
6080: 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74        pRet = (Ft
6090: 73 35 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f  s5Data*)sqlite3_
60a0: 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a  malloc(nAlloc);.
60b0: 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
60c0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
60d0: 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  nn = nByte;.    
60e0: 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d      aOut = pRet-
60f0: 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b  >p = (u8*)&pRet[
6100: 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
6110: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6120: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6130: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
6140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6150: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6160: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
6170: 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c  ->pReader, aOut,
6180: 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20   nByte, 0);.    
6190: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
61a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
61b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
61c0: 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ree(pRet);.     
61d0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
61e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
61f0: 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20    /* TODO1: Fix 
6200: 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  this */.        
6210: 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66  pRet->szLeaf = f
6220: 74 73 35 47 65 74 55 31 36 28 26 70 52 65 74 2d  ts5GetU16(&pRet-
6230: 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  >p[2]);.      }.
6240: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
6250: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
6260: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ad++;.  }..  ass
6270: 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d  ert( (pRet==0)==
6280: 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (p->rc!=SQLITE_O
6290: 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  K) );.  return p
62a0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
62b0: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
62c0: 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64  e to data record
62d0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
62e0: 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
62f0: 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64 28  ** fts5DataRead(
6300: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6310: 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73  d fts5DataReleas
6320: 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74  e(Fts5Data *pDat
6330: 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  a){.  sqlite3_fr
6340: 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74  ee(pData);.}..st
6350: 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
6360: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20  exPrepareStmt(. 
6370: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
6380: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6390: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
63a0: 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d  zSql.){.  if( p-
63b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
63c0: 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29  {.    if( zSql )
63d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
63e0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
63f0: 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64  v2(p->pConfig->d
6400: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6410: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  tmt, 0);.    }el
6420: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  se{.      p->rc 
6430: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6440: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6450: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6460: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
6470: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54  }.../*.** INSERT
6480: 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72 65   OR REPLACE a re
6490: 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f  cord into the %_
64a0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
64b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
64c0: 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e 64  ataWrite(Fts5Ind
64d0: 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
64e0: 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  d, const u8 *pDa
64f0: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
6500: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
6510: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
6520: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74  ..  if( p->pWrit
6530: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  er==0 ){.    Fts
6540: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
6550: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
6560: 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
6570: 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
6580: 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f  Writer, sqlite3_
6590: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
65a0: 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
65b0: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28   '%q'.'%q_data'(
65c0: 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45  id, block) VALUE
65d0: 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20  S(?,?)", .      
65e0: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
65f0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
6600: 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28  .    ));.    if(
6610: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
6620: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
6630: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57  bind_int64(p->pW
6640: 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64  riter, 1, iRowid
6650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6660: 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65  d_blob(p->pWrite
6670: 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61  r, 2, pData, nDa
6680: 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  ta, SQLITE_STATI
6690: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  C);.  sqlite3_st
66a0: 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ep(p->pWriter);.
66b0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
66c0: 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74  3_reset(p->pWrit
66d0: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  er);.}../*.** Ex
66e0: 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77  ecute the follow
66f0: 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20  ing SQL:.**.**  
6700: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25     DELETE FROM %
6710: 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 20 42  _data WHERE id B
6720: 45 54 57 45 45 4e 20 24 69 46 69 72 73 74 20 41  ETWEEN $iFirst A
6730: 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61  ND $iLast.*/.sta
6740: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6750: 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65  aDelete(Fts5Inde
6760: 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74  x *p, i64 iFirst
6770: 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20  , i64 iLast){.  
6780: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6790: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
67a0: 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65    if( p->pDelete
67b0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  r==0 ){.    int 
67c0: 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66  rc;.    Fts5Conf
67d0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
67e0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
67f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
6800: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6810: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6820: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20   '%q'.'%q_data' 
6830: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
6840: 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20  id<=?", .       
6850: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6860: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6870: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a      );.    if( z
6880: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
6890: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
68a0: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
68b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
68c0: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
68d0: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
68e0: 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c  1, &p->pDeleter,
68f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6900: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
6910: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
6920: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6930: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
6940: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6950: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
6960: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
6970: 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46  >pDeleter, 1, iF
6980: 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  irst);.  sqlite3
6990: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
69a0: 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73  Deleter, 2, iLas
69b0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t);.  sqlite3_st
69c0: 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ep(p->pDeleter);
69d0: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
69e0: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c  e3_reset(p->pDel
69f0: 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eter);.}../*.** 
6a00: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72  Remove all recor
6a10: 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ds associated wi
6a20: 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69  th segment iSegi
6a30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6a40: 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65  d fts5DataRemove
6a50: 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65  Segment(Fts5Inde
6a60: 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64  x *p, int iSegid
6a70: 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74 20  ){.  i64 iFirst 
6a80: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
6a90: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b  OWID(iSegid, 0);
6aa0: 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46  .  i64 iLast = F
6ab0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
6ac0: 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31  D(iSegid+1, 0)-1
6ad0: 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65  ;.  fts5DataDele
6ae0: 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c  te(p, iFirst, iL
6af0: 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ast);.  if( p->p
6b00: 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  IdxDeleter==0 ){
6b10: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6b20: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6b30: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6b40: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6b50: 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74  p, &p->pIdxDelet
6b60: 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
6b70: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
6b80: 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27  DELETE FROM '%q'
6b90: 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
6ba0: 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20  segid=?",.      
6bb0: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
6bc0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
6bd0: 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69  .    ));.  }.  i
6be0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
6bf0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
6c00: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
6c10: 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  IdxDeleter, 1, i
6c20: 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Segid);.    sqli
6c30: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
6c40: 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d  Deleter);.    p-
6c50: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6c60: 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74  set(p->pIdxDelet
6c70: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
6c80: 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
6c90: 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35  rence to an Fts5
6ca0: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
6cb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
6cc0: 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c  earlier .** call
6cd0: 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75 72   to fts5Structur
6ce0: 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35 53  eRead() or fts5S
6cf0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
6d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6d10: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
6d20: 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63 74  lease(Fts5Struct
6d30: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
6d40: 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20   if( pStruct && 
6d50: 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e  0>=(--pStruct->n
6d60: 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  Ref) ){.    int 
6d70: 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
6d80: 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20  Struct->nRef==0 
6d90: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
6da0: 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  i<pStruct->nLeve
6db0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
6dc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
6dd0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  uct->aLevel[i].a
6de0: 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Seg);.    }.    
6df0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6e00: 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ruct);.  }.}..st
6e10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
6e20: 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35 53  ructureRef(Fts5S
6e30: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
6e40: 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e  t){.  pStruct->n
6e50: 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ref++;.}../*.** 
6e60: 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  Deserialize and 
6e70: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
6e80: 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72 72  ture record curr
6e90: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
6ea0: 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f  serialized.** fo
6eb0: 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65 72  rm within buffer
6ec0: 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a   pData/nData..**
6ed0: 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75  .** The Fts5Stru
6ee0: 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61  cture.aLevel[] a
6ef0: 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75  nd each Fts5Stru
6f00: 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b  ctureLevel.aSeg[
6f10: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f  ] array.** are o
6f20: 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79  ver-allocated by
6f30: 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20   one slot. This 
6f40: 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63  allows the struc
6f50: 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a  ture contents.**
6f60: 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69   to be more easi
6f70: 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  ly edited..**.**
6f80: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6f90: 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73  urs, *ppOut is s
6fa0: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61  et to NULL and a
6fb0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
6fc0: 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ode.** returned.
6fd0: 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f   Otherwise, *ppO
6fe0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
6ff0: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62  nt to the new ob
7000: 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ject and.** SQLI
7010: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
7020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
7030: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
7040: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  e(.  const u8 *p
7050: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
7060: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
7070: 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c  ontaining serial
7080: 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20 2a  ized structure *
7090: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
70c0: 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20 62  uffer pData in b
70d0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
70e0: 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20  iCookie,        
70f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
7100: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
7110: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73  e value */.  Fts
7120: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f  5Structure **ppO
7130: 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ut           /* 
7140: 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65  OUT: Deserialize
7150: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  d object */.){. 
7160: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7170: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30  _OK;.  int i = 0
7180: 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20  ;.  int iLvl;.  
7190: 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a  int nLevel = 0;.
71a0: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
71b0: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   0;.  int nByte;
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
71e0: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
71f0: 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20  ate at pRet */. 
7200: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7210: 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pRet = 0;       
7220: 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62   /* Structure ob
7230: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
7240: 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  /..  /* Grab the
7250: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
7260: 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20  .  if( piCookie 
7270: 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71  ) *piCookie = sq
7280: 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28 70  lite3Fts5Get32(p
7290: 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a  Data);.  i = 4;.
72a0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74  .  /* Read the t
72b0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  otal number of l
72c0: 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e  evels and segmen
72d0: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ts from the star
72e0: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74  t of the.  ** st
72f0: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20  ructure record. 
7300: 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47   */.  i += fts5G
7310: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7320: 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20  a[i], nLevel);. 
7330: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7340: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7350: 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42   nSegment);.  nB
7360: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69  yte = (.      si
7370: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7380: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
7390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
73a0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
73b0: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
73c0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
73d0: 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f   (nLevel-1)    /
73e0: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
73f0: 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20   */.  );.  pRet 
7400: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7410: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
7420: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
7430: 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74  te);..  if( pRet
7440: 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52   ){.    pRet->nR
7450: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74  ef = 1;.    pRet
7460: 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65  ->nLevel = nLeve
7470: 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65  l;.    pRet->nSe
7480: 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74  gment = nSegment
7490: 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
74a0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
74b0: 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74  &pData[i], &pRet
74c0: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
74d0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
74e0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
74f0: 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b   && iLvl<nLevel;
7500: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
7510: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7520: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74  el *pLvl = &pRet
7530: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
7540: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c        int nTotal
7550: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
7560: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  ;..      i += ft
7570: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7580: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7590: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20  Merge);.      i 
75a0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
75b0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
75c0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  otal);.      ass
75d0: 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76  ert( nTotal>=pLv
75e0: 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20  l->nMerge );.   
75f0: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
7600: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7610: 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
7620: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
7630: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f  , .          nTo
7640: 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  tal * sizeof(Fts
7650: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7660: 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  t).      );..   
7670: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7680: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7690: 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f  pLvl->nSeg = nTo
76a0: 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  tal;.        for
76b0: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54  (iSeg=0; iSeg<nT
76c0: 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  otal; iSeg++){. 
76d0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
76e0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
76f0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
7700: 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
7710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
7720: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7730: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
7740: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
7750: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
7760: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
7770: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7780: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
7790: 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg].pgnoLast);.
77a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
77b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
77c0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
77d0: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
77e0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
77f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7800: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
7810: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7820: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
7830: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
7840: 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20  ureAddLevel(int 
7850: 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74  *pRc, Fts5Struct
7860: 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b  ure **ppStruct){
7870: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7890: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
78a0: 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
78b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c  ;.    int nLevel
78c0: 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
78d0: 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  el;.    int nByt
78e0: 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69  e = (.        si
78f0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7900: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
7910: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
7920: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7930: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7940: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
7950: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20   (nLevel+1)  /* 
7960: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
7970: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53  /.    );..    pS
7980: 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  truct = sqlite3_
7990: 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c  realloc(pStruct,
79a0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
79b0: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
79c0: 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63    memset(&pStruc
79d0: 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c  t->aLevel[nLevel
79e0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
79f0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
7a00: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
7a10: 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
7a20: 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
7a30: 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65  truct;.    }else
7a40: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
7a50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
7a60: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7a70: 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76  Extend level iLv
7a80: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  l so that there 
7a90: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
7aa0: 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65  east nExtra more
7ab0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f  .** segments..*/
7ac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7ad0: 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
7ae0: 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52  Level(.  int *pR
7af0: 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  c, .  Fts5Struct
7b00: 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20  ure *pStruct, . 
7b10: 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e   int iLvl, .  in
7b20: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
7b30: 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66   bInsert.){.  if
7b40: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
7b50: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
7b60: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
7b70: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
7b80: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
7b90: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7ba0: 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20  ment *aNew;.    
7bb0: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
7bc0: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
7bd0: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
7be0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7bf0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
7c00: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
7c10: 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61  _realloc(pLvl->a
7c20: 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Seg, nByte);.   
7c30: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
7c40: 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d     if( bInsert==
7c50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
7c60: 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e  set(&aNew[pLvl->
7c70: 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSeg], 0, sizeof
7c80: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7c90: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
7ca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7cb0: 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65         int nMove
7cc0: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20   = pLvl->nSeg * 
7cd0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7ce0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
7cf0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
7d00: 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65  New[nExtra], aNe
7d10: 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20  w, nMove);.     
7d20: 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20     memset(aNew, 
7d30: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
7d40: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
7d50: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
7d60: 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61   }.      pLvl->a
7d70: 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Seg = aNew;.    
7d80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7d90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7db0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
7dc0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
7dd0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
7de0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
7df0: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
7e00: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
7e10: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
7e20: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
7e30: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
7e40: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
7e50: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
7e60: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
7e70: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
7e80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
7e90: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
7ea0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
7eb0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
7ec0: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
7ed0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
7ee0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
7ef0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
7f00: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
7f10: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
7f20: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
7f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
7f40: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
7f50: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
7f60: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
7f70: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
7f80: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
7f90: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7fa0: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7fb0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72    /* Object to r
7fc0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
7fd0: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
7fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7ff0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
8000: 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  ie */.  Fts5Data
8010: 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74   *pData;..  pDat
8020: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
8030: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
8040: 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28  RE_ROWID);.  if(
8050: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20   p->rc ) return 
8060: 30 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  0;.  /* TODO: Do
8070: 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66   we need this if
8080: 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20   the leaf-index 
8090: 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f  is appended? Pro
80a0: 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d 65  bably... */.  me
80b0: 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70 5b 70  mset(&pData->p[p
80c0: 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54  Data->nn], 0, FT
80d0: 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
80e0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35  ;.  p->rc = fts5
80f0: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8100: 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
8110: 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26  >nn, &iCookie, &
8120: 70 52 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pRet);.  if( p->
8130: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8140: 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
8150: 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20  e!=iCookie ){.  
8160: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
8170: 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28  3Fts5ConfigLoad(
8180: 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65  pConfig, iCookie
8190: 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61  );.  }..  fts5Da
81a0: 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
81b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ;.  if( p->rc!=S
81c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
81d0: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
81e0: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
81f0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
8200: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
8210: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8220: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8230: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
8240: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
8250: 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ruct. This.** fu
8260: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
8270: 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72 74  ver used as part
8280: 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e   of assert() con
8290: 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64  ditions..*/.#ifd
82a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
82b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
82c0: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
82d0: 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74  ments(Fts5Struct
82e0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
82f0: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
8300: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8310: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
8320: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
8330: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
8340: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8370: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
8380: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  vels */.    for(
8390: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
83a0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
83b0: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65  vl++){.      nSe
83c0: 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74  gment += pStruct
83d0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
83e0: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Seg;.    }.  }..
83f0: 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e    return nSegmen
8400: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  t;.}.#endif..#de
8410: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 53  fine fts5BufferS
8420: 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
8430: 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  uf, pBlob, nBlob
8440: 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73 73 65  ) {     \.  asse
8450: 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61  rt( (pBuf)->nSpa
8460: 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e  ce>=((pBuf)->n+n
8470: 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20  Blob) );        
8480: 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28       \.  memcpy(
8490: 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66  &(pBuf)->p[(pBuf
84a0: 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42  )->n], pBlob, nB
84b0: 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20 20  lob);           
84c0: 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20    \.  (pBuf)->n 
84d0: 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  += nBlob;       
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8500: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
8510: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
8520: 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 56 61  Varint(pBuf, iVa
8530: 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l) {            
8540: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
8550: 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
8560: 50 75 74 56 61 72 69 6e 74 28 26 28 70 42 75 66  PutVarint(&(pBuf
8570: 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c  )->p[(pBuf)->n],
8580: 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61   (iVal));  \.  a
8590: 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e  ssert( (pBuf)->n
85a0: 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e  Space>=(pBuf)->n
85b0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
85d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69  .../*.** Seriali
85e0: 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ze and store the
85f0: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
8600: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ord..**.** If an
8610: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
8620: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
8630: 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e  de in the Fts5In
8640: 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  dex object. If a
8650: 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61  n.** error has a
8660: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
8670: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
8680: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
8690: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
86a0: 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74 73  ructureWrite(Fts
86b0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
86c0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
86d0: 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t){.  if( p->rc=
86e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
86f0: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
8700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8710: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65 72  /* Buffer to ser
8720: 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e  ialize record in
8730: 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  to */.    int iL
8740: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
8750: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
8760: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
8770: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
8780: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87a0: 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74  * Cookie value t
87b0: 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20  o store */..    
87c0: 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
87d0: 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53  >nSegment==fts5S
87e0: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
87f0: 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29  ments(pStruct) )
8800: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75  ;.    memset(&bu
8810: 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
8820: 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
8830: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75  /* Append the cu
8840: 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74  rrent configurat
8850: 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ion cookie */.  
8860: 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70    iCookie = p->p
8870: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b  Config->iCookie;
8880: 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65  .    if( iCookie
8890: 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30  <0 ) iCookie = 0
88a0: 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  ;..    if( 0==sq
88b0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
88c0: 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  ize(&p->rc, &buf
88d0: 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20 20  , 4+9+9+9) ){.  
88e0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
88f0: 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43 6f 6f  ut32(buf.p, iCoo
8900: 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75 66 2e  kie);.      buf.
8910: 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66 74 73  n = 4;.      fts
8920: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
8930: 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53  dVarint(&buf, pS
8940: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a  truct->nLevel);.
8950: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8960: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
8970: 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e  (&buf, pStruct->
8980: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  nSegment);.     
8990: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
89a0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
89b0: 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e  , (i64)pStruct->
89c0: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
89d0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
89e0: 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
89f0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
8a00: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
8a10: 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
8a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8a30: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8a40: 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
8a50: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
8a60: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
8a70: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
8a80: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
8a90: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8aa0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8ab0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  buf, pLvl->nMerg
8ac0: 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
8ad0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8ae0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8af0: 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20  Lvl->nSeg);.    
8b00: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
8b10: 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
8b20: 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  eg );..      for
8b30: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
8b40: 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
8b50: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
8b60: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8b70: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8b80: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
8b90: 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  .iSegid);.      
8ba0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8bb0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8bc0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8bd0: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
8be0: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
8bf0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8c00: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8c10: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8c20: 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20  ].pgnoLast);.   
8c30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8c40: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
8c50: 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
8c60: 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75  ROWID, buf.p, bu
8c70: 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75  f.n);.    fts5Bu
8c80: 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
8c90: 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61    }.}..#if 0.sta
8ca0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
8cb0: 75 67 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a  ugStructure(int*
8cc0: 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73  ,Fts5Buffer*,Fts
8cd0: 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74  5Structure*);.st
8ce0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 72  atic void fts5Pr
8cf0: 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e  intStructure(con
8d00: 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f  st char *zCaptio
8d10: 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  n, Fts5Structure
8d20: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
8d30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8d40: 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
8d50: 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
8d60: 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66  f, 0, sizeof(buf
8d70: 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53  ));.  fts5DebugS
8d80: 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 62  tructure(&rc, &b
8d90: 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  uf, pStruct);.  
8da0: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
8db0: 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70  "%s: %s\n", zCap
8dc0: 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20  tion, buf.p);.  
8dd0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
8de0: 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
8df0: 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a  (&buf);.}.#else.
8e00: 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72 69  # define fts5Pri
8e10: 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79 29  ntStructure(x,y)
8e20: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
8e30: 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53  int fts5SegmentS
8e40: 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ize(Fts5Structur
8e50: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b  eSegment *pSeg){
8e60: 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53  .  return 1 + pS
8e70: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  eg->pgnoLast - p
8e80: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a  Seg->pgnoFirst;.
8e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8ea0: 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20  a copy of index 
8eb0: 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
8ec0: 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f  t. Except, promo
8ed0: 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73  te as many .** s
8ee0: 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69  egments as possi
8ef0: 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72  ble to level iPr
8f00: 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d  omote. If an OOM
8f10: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
8f20: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
8f30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
8f40: 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
8f50: 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65  teTo(.  Fts5Inde
8f60: 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f  x *p,.  int iPro
8f70: 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72  mote,.  int szPr
8f80: 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72  omote,.  Fts5Str
8f90: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a  ucture *pStruct.
8fa0: 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b  ){.  int il, is;
8fb0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
8fc0: 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70  Level *pOut = &p
8fd0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8fe0: 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28  Promote];..  if(
8ff0: 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30   pOut->nMerge==0
9000: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69   ){.    for(il=i
9010: 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53  Promote+1; il<pS
9020: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9030: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
9040: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
9050: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
9060: 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20  >aLevel[il];.   
9070: 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
9080: 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  rge ) return;.  
9090: 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d      for(is=pLvl-
90a0: 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20  >nSeg-1; is>=0; 
90b0: 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69  is--){.        i
90c0: 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d  nt sz = fts5Segm
90d0: 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61  entSize(&pLvl->a
90e0: 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20  Seg[is]);.      
90f0: 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f    if( sz>szPromo
9100: 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  te ) return;.   
9110: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
9120: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
9130: 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69  ->rc, pStruct, i
9140: 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a  Promote, 1, 1);.
9150: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
9160: 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
9170: 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d      memcpy(pOut-
9180: 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53  >aSeg, &pLvl->aS
9190: 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46  eg[is], sizeof(F
91a0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
91b0: 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70  ent));.        p
91c0: 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
91d0: 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d       pLvl->nSeg-
91e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
91f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
9200: 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20  new segment has 
9210: 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65  just been writte
9220: 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20  n to level iLvl 
9230: 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  of index structu
9240: 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54  re.** pStruct. T
9250: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
9260: 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73  ermines if any s
9270: 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  egments should b
9280: 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73  e promoted.** as
9290: 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65   a result. Segme
92a0: 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64  nts are promoted
92b0: 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
92c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66  s:.**.**   a) If
92d0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73   the segment jus
92e0: 74 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61  t written is sma
92f0: 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72  ller than one or
9300: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a   more segments.*
9310: 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20 74 68  *      within th
9320: 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c  e previous popul
9330: 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69  ated level, it i
9340: 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68  s promoted to th
9350: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20  e previous.**   
9360: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76     populated lev
9370: 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49  el..**.**   b) I
9380: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75  f the segment ju
9390: 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61  st written is la
93a0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65  rger than the ne
93b0: 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a  west segment on.
93c0: 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78 74  **      the next
93d0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
93e0: 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d  , then that segm
93f0: 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68  ent, and any oth
9400: 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20  er adjacent.**  
9410: 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61      segments tha
9420: 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c  t are also small
9430: 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20  er than the one 
9440: 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72  just written, ar
9450: 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f  e .**      promo
9460: 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  ted. .**.** If o
9470: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
9480: 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64  nts are promoted
9490: 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  , the structure 
94a0: 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61 74 65  object is update
94b0: 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20  d.** to reflect 
94c0: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
94d0: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
94e0: 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73  rePromote(.  Fts
94f0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9510: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
9520: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76  ect */.  int iLv
9530: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9540: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9550: 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64  x level just upd
9560: 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74  ated */.  Fts5St
9570: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9590: 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
95a0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
95b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
95c0: 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69   int iTst;.    i
95d0: 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31  nt iPromote = -1
95e0: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d  ;.    int szProm
95f0: 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ote = 0;        
9600: 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61      /* Promote a
9610: 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a  nything this siz
9620: 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a  e or smaller */.
9630: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
9640: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
9650: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73    /* Segment jus
9660: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
9670: 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20   int szSeg;     
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9690: 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e  * Size of segmen
96a0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  t just written *
96b0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d  /.    int nSeg =
96c0: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
96d0: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20  [iLvl].nSeg;..  
96e0: 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 29 20    if( nSeg==0 ) 
96f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 65 67  return;.    pSeg
9700: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9710: 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70  vel[iLvl].aSeg[p
9720: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9730: 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Lvl].nSeg-1];.  
9740: 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70    szSeg = (1 + p
9750: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9760: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
9770: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
9780: 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61  for condition (a
9790: 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73  ) */.    for(iTs
97a0: 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d  t=iLvl-1; iTst>=
97b0: 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  0 && pStruct->aL
97c0: 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d  evel[iTst].nSeg=
97d0: 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20  =0; iTst--);.   
97e0: 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a   if( iTst>=0 ){.
97f0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9800: 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30     int szMax = 0
9810: 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
9820: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74  ctureLevel *pTst
9830: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9840: 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20  vel[iTst];.     
9850: 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e   assert( pTst->n
9860: 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Merge==0 );.    
9870: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73    for(i=0; i<pTs
9880: 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  t->nSeg; i++){. 
9890: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
98a0: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
98b0: 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61  noLast - pTst->a
98c0: 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74  Seg[i].pgnoFirst
98d0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   + 1;.        if
98e0: 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d  ( sz>szMax ) szM
98f0: 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d  ax = sz;.      }
9900: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78  .      if( szMax
9910: 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20  >=szSeg ){.     
9920: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
9930: 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f  (a) is true. Pro
9940: 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74 20  mote the newest 
9950: 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c  segment on level
9960: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76   .        ** iLv
9970: 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e  l to level iTst.
9980: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72    */.        iPr
9990: 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20  omote = iTst;.  
99a0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
99b0: 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d  = szMax;.      }
99c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
99d0: 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  f condition (a) 
99e0: 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75  is not met, assu
99f0: 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e 20  me (b) is true. 
9a00: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9a10: 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61  To().    ** is a
9a20: 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20   no-op if it is 
9a30: 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  not.  */.    if(
9a40: 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20   iPromote<0 ){. 
9a50: 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20       iPromote = 
9a60: 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72  iLvl;.      szPr
9a70: 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20  omote = szSeg;. 
9a80: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
9a90: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
9aa0: 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50  p, iPromote, szP
9ab0: 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29  romote, pStruct)
9ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
9ad0: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
9ae0: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
9af0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
9b00: 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20  . If the end of 
9b10: 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  the .** doclist-
9b20: 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 72 65  index page is re
9b30: 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f  ached, return no
9b40: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
9b50: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c  c int fts5DlidxL
9b60: 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78  vlNext(Fts5Dlidx
9b70: 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74  Lvl *pLvl){.  Ft
9b80: 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  s5Data *pData = 
9b90: 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20  pLvl->pData;..  
9ba0: 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d  if( pLvl->iOff==
9bb0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
9bc0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29   pLvl->bEof==0 )
9bd0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
9be0: 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e   = 1;.    pLvl->
9bf0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
9c00: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d 3e  arint32(&pData->
9c10: 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61  p[1], pLvl->iLea
9c20: 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c  fPgno);.    pLvl
9c30: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
9c40: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
9c50: 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28  p[pLvl->iOff], (
9c60: 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77  u64*)&pLvl->iRow
9c70: 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  id);.    pLvl->i
9c80: 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d  FirstOff = pLvl-
9c90: 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >iOff;.  }else{.
9ca0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
9cb0: 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d    for(iOff=pLvl-
9cc0: 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74  >iOff; iOff<pDat
9cd0: 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a  a->nn; iOff++){.
9ce0: 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 2d        if( pData-
9cf0: 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b  >p[iOff] ) break
9d00: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
9d10: 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ( iOff<pData->nn
9d20: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56   ){.      i64 iV
9d30: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
9d40: 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f  iLeafPgno += (iO
9d50: 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29  ff - pLvl->iOff)
9d60: 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66   + 1;.      iOff
9d70: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
9d80: 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  t(&pData->p[iOff
9d90: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
9da0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f  .      pLvl->iRo
9db0: 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20  wid += iVal;.   
9dc0: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
9dd0: 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iOff;.    }else{
9de0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  .      pLvl->bEo
9df0: 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  f = 1;.    }.  }
9e00: 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d  ..  return pLvl-
9e10: 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >bEof;.}../*.** 
9e20: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
9e30: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
9e40: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
9e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9e60: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
9e70: 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  tR(Fts5Index *p,
9e80: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
9e90: 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29  pIter, int iLvl)
9ea0: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  {.  Fts5DlidxLvl
9eb0: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
9ec0: 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20  >aLvl[iLvl];..  
9ed0: 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74  assert( iLvl<pIt
9ee0: 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66  er->nLvl );.  if
9ef0: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
9f00: 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20  xt(pLvl) ){.    
9f10: 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70  if( (iLvl+1) < p
9f20: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20  Iter->nLvl ){.  
9f30: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
9f40: 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c  rNextR(p, pIter,
9f50: 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iLvl+1);.      
9f60: 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66  if( pLvl[1].bEof
9f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
9f80: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
9f90: 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  Lvl->pData);.   
9fa0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
9fb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
9fc0: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
9fd0: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
9fe0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
9ff0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  , .            F
a000: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
a010: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
a020: 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65  Lvl, pLvl[1].iLe
a030: 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  afPgno).        
a040: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a050: 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74 73  Lvl->pData ) fts
a060: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
a070: 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vl);.      }.   
a080: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a090: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
a0a0: 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bEof;.}.static i
a0b0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
a0c0: 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Next(Fts5Index *
a0d0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a0e0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
a0f0: 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  rn fts5DlidxIter
a100: 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20  NextR(p, pIter, 
a110: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  0);.}../*.** The
a120: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
a130: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
a140: 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66  gument has the f
a150: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
a160: 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  set.** as follow
a170: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
a180: 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73   sets up the res
a190: 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  t of the iterato
a1a0: 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  r so that it.** 
a1b0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
a1c0: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
a1d0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
a1e0: 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a  **.**   pData:.*
a1f0: 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74 6f  *     pointer to
a200: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
a210: 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68  ecord, .**.** Wh
a220: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
a230: 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72   is called pIter
a240: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74  ->iLeafPgno is t
a250: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
a260: 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73  he.** doclist is
a270: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a280: 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72   (the one featur
a290: 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a  ing the term)..*
a2a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a2b0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
a2c0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
a2d0: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
a2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
a2f0: 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
a300: 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76 6c      fts5DlidxLvl
a310: 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c 76  Next(&pIter->aLv
a320: 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  l[i]);.  }.  ret
a330: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
a340: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61  0].bEof;.}...sta
a350: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a360: 78 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  xIterEof(Fts5Ind
a370: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
a380: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
a390: 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51  return p->rc!=SQ
a3a0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
a3b0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a3c0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
a3d0: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
a3e0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
a3f0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
a400: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ter){.  int i;..
a410: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
a420: 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20 6c  h level to the l
a430: 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ast entry on the
a440: 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20 20   last page */.  
a450: 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76  for(i=pIter->nLv
a460: 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l-1; p->rc==SQLI
a470: 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69  TE_OK && i>=0; i
a480: 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  --){.    Fts5Dli
a490: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
a4a0: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20  Iter->aLvl[i];. 
a4b0: 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c     while( fts5Dl
a4c0: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
a4d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  ==0 );.    pLvl-
a4e0: 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20  >bEof = 0;..    
a4f0: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
a500: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
a510: 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31  Child = &pLvl[-1
a520: 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ];.      fts5Dat
a530: 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64 2d  aRelease(pChild-
a540: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 6d  >pData);.      m
a550: 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30 2c  emset(pChild, 0,
a560: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
a570: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 43  xLvl));.      pC
a580: 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66 74  hild->pData = ft
a590: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
a5a0: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
a5b0: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
a5c0: 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c  >iSegid, i-1, pL
a5d0: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  vl->iLeafPgno). 
a5e0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
a5f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
a600: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
a610: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
a620: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
a630: 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a  previous entry..
a640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
a650: 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 46  s5DlidxLvlPrev(F
a660: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a670: 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  l){.  int iOff =
a680: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20   pLvl->iOff;..  
a690: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
a6a0: 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  of==0 );.  if( i
a6b0: 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73  Off<=pLvl->iFirs
a6c0: 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c  tOff ){.    pLvl
a6d0: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65  ->bEof = 1;.  }e
a6e0: 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  lse{.    u8 *a =
a6f0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b   pLvl->pData->p;
a700: 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
a710: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20     int iLimit;. 
a720: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69     int ii;.    i
a730: 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20  nt nZero = 0;.. 
a740: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20     /* Currently 
a750: 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74  iOff points to t
a760: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
a770: 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20   a varint. This 
a780: 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65  block .    ** de
a790: 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e  crements iOff un
a7a0: 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
a7b0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
a7c0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
a7d0: 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20  .    ** varint. 
a7e0: 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20  Taking care not 
a7f0: 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f  to read any memo
a800: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61  ry locations tha
a810: 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62  t occur.    ** b
a820: 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  efore the buffer
a830: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a   in memory.  */.
a840: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f      iLimit = (iO
a850: 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20  ff>9 ? iOff-9 : 
a860: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  0);.    for(iOff
a870: 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b  --; iOff>iLimit;
a880: 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20   iOff--){.      
a890: 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26  if( (a[iOff-1] &
a8a0: 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61   0x80)==0 ) brea
a8b0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  k;.    }..    ft
a8c0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
a8d0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
a8e0: 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52  l);.    pLvl->iR
a8f0: 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20  owid -= iVal;.  
a900: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
a910: 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69  o--;..    /* Ski
a920: 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 74  p backwards past
a930: 20 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e 74   any 0x00 varint
a940: 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  s. */.    for(ii
a950: 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76  =iOff-1; ii>=pLv
a960: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20  l->iFirstOff && 
a970: 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d  a[ii]==0x00; ii-
a980: 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b  -){.      nZero+
a990: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
a9a0: 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73   ii>=pLvl->iFirs
a9b0: 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20 26  tOff && (a[ii] &
a9c0: 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20 20   0x80) ){.      
a9d0: 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d 65  /* The byte imme
a9e0: 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74  diately before t
a9f0: 68 65 20 6c 61 73 74 20 30 78 30 30 20 62 79 74  he last 0x00 byt
aa00: 65 20 68 61 73 20 74 68 65 20 30 78 38 30 20 62  e has the 0x80 b
aa10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  it.      ** set.
aa20: 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78 30   So the last 0x0
aa30: 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72 69  0 is only a vari
aa40: 6e 74 20 30 20 69 66 20 74 68 65 72 65 20 61 72  nt 0 if there ar
aa50: 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20 20  e 8 more 0x80.  
aa60: 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65 66      ** bytes bef
aa70: 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20  ore a[ii]. */.  
aa80: 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20      int bZero = 
aa90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
aaa0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74 20  /* True if last 
aab0: 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20  0x00 counts */. 
aac0: 20 20 20 20 20 69 66 28 20 28 69 69 2d 38 29 3e       if( (ii-8)>
aad0: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
aae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
aaf0: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
ab00: 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69  =1; j<=8 && (a[i
ab10: 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b  i-j] & 0x80); j+
ab20: 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65 72  +);.        bZer
ab30: 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20  o = (j>8);.     
ab40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a 65   }.      if( bZe
ab50: 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b  ro==0 ) nZero--;
ab60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d  .    }.    pLvl-
ab70: 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a  >iLeafPgno -= nZ
ab80: 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  ero;.    pLvl->i
ab90: 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65  Off = iOff - nZe
aba0: 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ro;.  }..  retur
abb0: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
abc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
abd0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 46  DlidxIterPrevR(F
abe0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
abf0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
ac00: 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20  r, int iLvl){.  
ac10: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
ac20: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
ac30: 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65  l[iLvl];..  asse
ac40: 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e  rt( iLvl<pIter->
ac50: 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74  nLvl );.  if( ft
ac60: 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 70  s5DlidxLvlPrev(p
ac70: 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Lvl) ){.    if( 
ac80: 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72  (iLvl+1) < pIter
ac90: 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20  ->nLvl ){.      
aca0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
acb0: 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76  vR(p, pIter, iLv
acc0: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
acd0: 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20  pLvl[1].bEof==0 
ace0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
acf0: 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
ad00: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
ad10: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
ad20: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
ad30: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  xLvl));.        
ad40: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
ad50: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
ad60: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
ad70: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
ad80: 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c  r->iSegid, iLvl,
ad90: 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67   pLvl[1].iLeafPg
ada0: 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
adb0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
adc0: 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  >pData ){.      
add0: 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44      while( fts5D
ade0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
adf0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
ae00: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
ae10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ae20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
ae30: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
ae40: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
ae50: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
ae60: 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73 35  idxIterPrev(Fts5
ae70: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
ae80: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
ae90: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
aea0: 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20  idxIterPrevR(p, 
aeb0: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
aec0: 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69  .** Free a docli
aed0: 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f  st-index iterato
aee0: 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74  r object allocat
aef0: 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49  ed by fts5DlidxI
af00: 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  terInit()..*/.st
af10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
af20: 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35  idxIterFree(Fts5
af30: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
af40: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
af50: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
af60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
af70: 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nLvl; i++){. 
af80: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
af90: 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c  ease(pIter->aLvl
afa0: 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20 20  [i].pData);.    
afb0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
afc0: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
afd0: 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c 69  ..static Fts5Dli
afe0: 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69 64  dxIter *fts5Dlid
aff0: 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  xIterInit(.  Fts
b000: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b020: 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20  Fts5 Backend to 
b030: 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
b040: 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
b070: 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a  ORDER BY ASC */.
b080: 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
b0b0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
b0e0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64  e number to load
b0f0: 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b   dlidx for */.){
b100: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
b110: 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69   *pIter = 0;.  i
b120: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e  nt i;.  int bDon
b130: 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
b140: 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
b150: 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b  _OK && bDone==0;
b160: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
b170: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
b180: 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69  s5DlidxIter) + i
b190: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   * sizeof(Fts5Dl
b1a0: 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73  idxLvl);.    Fts
b1b0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77  5DlidxIter *pNew
b1c0: 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46  ;..    pNew = (F
b1d0: 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71  ts5DlidxIter*)sq
b1e0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49  lite3_realloc(pI
b1f0: 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ter, nByte);.   
b200: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
b210: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
b220: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
b240: 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44   iRowid = FTS5_D
b250: 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69  LIDX_ROWID(iSegi
b260: 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a  d, i, iLeafPg);.
b270: 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c        Fts5DlidxL
b280: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77  vl *pLvl = &pNew
b290: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20  ->aLvl[i];.     
b2a0: 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20   pIter = pNew;. 
b2b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
b2c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
b2d0: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
b2e0: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
b2f0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b300: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
b310: 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26  f( pLvl->pData &
b320: 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e  & (pLvl->pData->
b330: 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d  p[0] & 0x0001)==
b340: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f  0 ){.        bDo
b350: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
b360: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76        pIter->nLv
b370: 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  l = i+1;.    }. 
b380: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
b390: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b3a0: 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20    pIter->iSegid 
b3b0: 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66  = iSegid;.    if
b3c0: 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
b3d0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
b3e0: 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20  First(pIter);.  
b3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
b400: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
b410: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
b420: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
b430: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b440: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74  .    fts5DlidxIt
b450: 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
b460: 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
b470: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
b480: 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34  r;.}..static i64
b490: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
b4a0: 77 69 64 28 46 74 73 35 44 6c 69 64 78 49 74 65  wid(Fts5DlidxIte
b4b0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
b4c0: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
b4d0: 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61  0].iRowid;.}.sta
b4e0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
b4f0: 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c  xIterPgno(Fts5Dl
b500: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b510: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b520: 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67  >aLvl[0].iLeafPg
b530: 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  no;.}../*.** Loa
b540: 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20  d the next leaf 
b550: 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65  page into the se
b560: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a  gment iterator..
b570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
b580: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
b590: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
b5a0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
b5b0: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
b5c0: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
b5d0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
b5e0: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
b5f0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
b600: 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74   advance to next
b610: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   page */.){.  Ft
b620: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
b630: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
b640: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
b650: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73  ter->pSeg;.  fts
b660: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
b670: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
b680: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b  ter->iLeafPgno++
b690: 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ;.  if( pIter->p
b6a0: 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20  NextLeaf ){.    
b6b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
b6c0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b  Iter->pNextLeaf;
b6d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
b6e0: 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLeaf = 0;.  }el
b6f0: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c  se if( pIter->iL
b700: 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  eafPgno<=pSeg->p
b710: 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
b720: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74  Iter->pLeaf = ft
b730: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
b740: 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d         FTS5_SEGM
b750: 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
b760: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
b770: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b  LeafPgno).    );
b780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
b790: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
b7a0: 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49    }.  pLeaf = pI
b7b0: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69  ter->pLeaf;..  i
b7c0: 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
b7d0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
b7e0: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
b7f0: 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65  ;.    if( fts5Le
b800: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
b810: 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74  af) ){.      pIt
b820: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
b830: 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  t = pLeaf->nn+1;
b840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b850: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
b860: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
b870: 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
b880: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
b890: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ],.          pIt
b8a0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
b8b0: 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
b8c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  .  }.}../*.** Ar
b8d0: 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20  gument p points 
b8e0: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
b8f0: 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20  aining a varint 
b900: 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  to be interprete
b910: 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69  d as a.** positi
b920: 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on list size fie
b930: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 72  ld. Read the var
b940: 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  int and return t
b950: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
b960: 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f  es.** read. Befo
b970: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65  re returning, se
b980: 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e  t *pnSz to the n
b990: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
b9a0: 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a  n the position.*
b9b0: 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44  * list, and *pbD
b9c0: 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  el to true if th
b9d0: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
b9e0: 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f   set, or false o
b9f0: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
ba00: 74 69 63 20 69 6e 74 20 66 74 73 35 47 65 74 50  tic int fts5GetP
ba10: 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74  oslistSize(const
ba20: 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53   u8 *p, int *pnS
ba30: 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a  z, int *pbDel){.
ba40: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74    int nSz;.  int
ba50: 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61   n = 0;.  fts5Fa
ba60: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  stGetVarint32(p,
ba70: 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65   n, nSz);.  asse
ba80: 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b  rt_nc( nSz>=0 );
ba90: 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32  .  *pnSz = nSz/2
baa0: 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a  ;.  *pbDel = nSz
bab0: 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74   & 0x0001;.  ret
bac0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
bad0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
bae0: 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c  fOffset currentl
baf0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
bb00: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a  first byte of a.
bb10: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
bb20: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
bb30: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  d the value of t
bb40: 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f  he field and sto
bb50: 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20  re it.** in the 
bb60: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
bb70: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  les:.**.**   Fts
bb80: 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a  5SegIter.nPos.**
bb90: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62     Fts5SegIter.b
bba0: 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20  Del.**.** Leave 
bbb0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
bbc0: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67  fOffset pointing
bbd0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
bbe0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f  te of the .** po
bbf0: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
bc00: 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f  ent (if any)..*/
bc10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
bc20: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
bc30: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
bc40: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
bc50: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
bc60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bc70: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
bc80: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
bc90: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
bca0: 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 69 6e  ead at */.    in
bcb0: 74 20 6e 53 7a 3b 0a 20 20 20 20 41 53 53 45 52  t nSz;.    ASSER
bcc0: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
bcd0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 66  r->pLeaf);.    f
bce0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
bcf0: 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  32(pIter->pLeaf-
bd00: 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a  >p, iOff, nSz);.
bd10: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
bd20: 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29  = (nSz & 0x0001)
bd30: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f  ;.    pIter->nPo
bd40: 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
bd50: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
bd60: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 61  et = iOff;.    a
bd70: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
bd80: 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 7d 0a  >nPos>=0 );.  }.
bd90: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
bda0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
bdb0: 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  wid(Fts5Index *p
bdc0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
bdd0: 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d  Iter){.  u8 *a =
bde0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
bdf0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  ;        /* Buff
be00: 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  er to read data 
be10: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  from */.  int iO
be20: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
be30: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45  fOffset;..  ASSE
be40: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
be50: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66  er->pLeaf);.  if
be60: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
be70: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
be80: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
be90: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
bea0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
beb0: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
bec0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
bed0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
bee0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
bef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
bf00: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
bf10: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
bf20: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
bf30: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
bf40: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
bf50: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
bf60: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
bf70: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
bf80: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a  fset = iOff;.}..
bf90: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
bfa0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
bfb0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
bfc0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
bfd0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75   of the .** "nSu
bfe0: 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61  ffix" field of a
bff0: 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20   term. Function 
c000: 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20  parameter nKeep 
c010: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
c020: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50  ue.** of the "nP
c030: 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66  refix" field (if
c040: 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d   there was one -
c050: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20   it is passed 0 
c060: 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68  if this is.** th
c070: 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20  e first term in 
c080: 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a  the segment)..**
c090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c0a0: 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a  n populates:.**.
c0b0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c0c0: 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53  .term.**   Fts5S
c0d0: 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a  egIter.rowid.**.
c0e0: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  ** accordingly a
c0f0: 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53  nd leaves (Fts5S
c100: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c110: 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63  et) set to the c
c120: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65  ontent of.** the
c130: 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20   first position 
c140: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
c150: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
c160: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  g to document .*
c170: 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  * (Fts5SegIter.i
c180: 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  Rowid)..*/.stati
c190: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c1a0: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
c1b0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
c1c0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
c1d0: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
c1e0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c1f0: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
c200: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
c210: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
c220: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
c230: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
c240: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
c250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
c280: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
c290: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
c2a0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
c2b0: 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65  ], nNew);.  pIte
c2c0: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65  r->term.n = nKee
c2d0: 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  p;.  fts5BufferA
c2e0: 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
c2f0: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
c300: 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  nNew, &a[iOff]);
c310: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
c320: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
c330: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c340: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
c350: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
c360: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
c370: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c380: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
c390: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
c3a0: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
c3b0: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
c3c0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
c3d0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c3e0: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
c3f0: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
c400: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
c410: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
c420: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
c430: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
c440: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
c450: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
c460: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
c470: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
c480: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
c490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c4a0: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
c4b0: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
c4c0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
c4d0: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
c4e0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
c4f0: 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  . The iterator i
c500: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
c510: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
c520: 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73  ry when .** this
c530: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
c540: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
c550: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
c560: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
c570: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
c580: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
c590: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
c5a0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
c5b0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
c5c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
c5d0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
c5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c5f0: 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
c600: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
c630: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
c640: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
c650: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
c660: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
c670: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
c680: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
c690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
c6a0: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
c6b0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
c6c0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
c6d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
c6e0: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
c6f0: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
c700: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
c710: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
c720: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
c730: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
c740: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
c750: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
c760: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
c770: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
c780: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
c790: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
c7a0: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
c7b0: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
c7c0: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
c7d0: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
c7e0: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
c7f0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
c800: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
c810: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
c820: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
c830: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
c840: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
c850: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c860: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
c870: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
c880: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74  pIter));.    pIt
c890: 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
c8a0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
c8b0: 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  fPgno = pSeg->pg
c8c0: 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66  noFirst-1;.    f
c8d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c8e0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
c8f0: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
c900: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c910: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c920: 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73  set = 4;.    ass
c930: 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70  ert_nc( pIter->p
c940: 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20  Leaf->nn>4 );.  
c950: 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4c 65    assert( fts5Le
c960: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
c970: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20  Iter->pLeaf)==4 
c980: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  );.    pIter->iP
c990: 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d  gidxOff = pIter-
c9a0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31  >pLeaf->szLeaf+1
c9b0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
c9c0: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
c9d0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35  er, 0);.    fts5
c9e0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
c9f0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
ca00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ca10: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
ca20: 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65  er called on ite
ca30: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
ca40: 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74  y calls to.** Ft
ca50: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77  s5IndexQuery() w
ca60: 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45  ith the FTS5INDE
ca70: 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61  X_QUERY_DESC fla
ca80: 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  g set..**.** The
ca90: 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20   iterator is in 
caa0: 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65  an unusual state
cab0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
cac0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74  ion is called: t
cad0: 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  he.** Fts5SegIte
cae0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61  r.iLeafOffset va
caf0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
cb00: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
cb10: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
cb20: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
cb30: 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20   size field for 
cb40: 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61  the first releva
cb50: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
cb60: 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67  page..** Fts5Seg
cb70: 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65  Iter.rowid is se
cb80: 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20  t, but nPos and 
cb90: 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a  bDel are not..**
cba0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
cbb0: 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69  n advances the i
cbc0: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
cbd0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
cbe0: 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61   last .** releva
cbf0: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
cc00: 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63  page and, if nec
cc10: 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69  essary, initiali
cc20: 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77  zes the .** aRow
cc30: 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69  idOffset[] and i
cc40: 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69  RowidOffset vari
cc50: 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70  ables. At this p
cc60: 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f  oint the iterato
cc70: 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72  r.** is in its r
cc80: 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46  egular state - F
cc90: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
cca0: 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f  Offset points to
ccb0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79   the first.** by
ccc0: 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  te of the positi
ccd0: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on list content 
cce0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ccf0: 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73  said rowid..*/.s
cd00: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cd10: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
cd20: 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  tPage(Fts5Index 
cd30: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
cd40: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e  *pIter){.  int n
cd50: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cd60: 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69  >szLeaf;.  int i
cd70: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
cd80: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d  ffset;.  u8 *a =
cd90: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
cda0: 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  ;.  int iRowidOf
cdb0: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  fset = 0;..  if(
cdc0: 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66   n>pIter->iEndof
cdd0: 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e  Doclist ){.    n
cde0: 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66   = pIter->iEndof
cdf0: 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
ce00: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
ce10: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
ce20: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
ce30: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
ce40: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
ce50: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
ce60: 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
ce70: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
ce80: 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  i], &nPos, &bDum
ce90: 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50  my);.    i += nP
cea0: 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  os;.    if( i>=n
ceb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20   ) break;.    i 
cec0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
ced0: 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69  (&a[i], (u64*)&i
cee0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
cef0: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
cf00: 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52  lta;..    if( iR
cf10: 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65  owidOffset>=pIte
cf20: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
cf30: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
cf40: 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69  w = pIter->nRowi
cf50: 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20  dOffset + 8;.   
cf60: 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28     int *aNew = (
cf70: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
cf80: 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77  lloc(pIter->aRow
cf90: 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73  idOffset, nNew*s
cfa0: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
cfb0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
cfc0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
cfd0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
cfe0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
d000: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
d010: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
d020: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
d030: 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d  et = nNew;.    }
d040: 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f  ..    pIter->aRo
d050: 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64  widOffset[iRowid
d060: 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65  Offset++] = pIte
d070: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
d080: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d090: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a  Offset = i;.  }.
d0a0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
d0b0: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
d0c0: 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49  fset;.  fts5SegI
d0d0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
d0e0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  Iter);.}../*.**.
d0f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d100: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
d110: 65 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64  eNewPage(Fts5Ind
d120: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
d130: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
d140: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
d150: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
d160: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
d170: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
d180: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d190: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20  ER_ONETERM );.. 
d1a0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
d1b0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
d1c0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d1d0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
d1e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d1f0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
d200: 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  o>pIter->iTermLe
d210: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74  afPgno ){.    Ft
d220: 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20  s5Data *pNew;.  
d230: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
d240: 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d  no--;.    pNew =
d250: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
d260: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
d270: 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
d280: 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
d290: 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  id, pIter->iLeaf
d2a0: 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20  Pgno.    ));.   
d2b0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
d2c0: 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f     /* iTermLeafO
d2d0: 66 66 73 65 74 20 6d 61 79 20 62 65 20 65 71 75  ffset may be equ
d2e0: 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20  al to szLeaf if 
d2f0: 74 68 65 20 74 65 72 6d 20 69 73 20 74 68 65 20  the term is the 
d300: 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  last.      ** th
d310: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
d320: 2d 20 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74  - i.e. the first
d330: 20 72 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65   rowid is on the
d340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e   following page.
d350: 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
d360: 73 20 63 61 73 65 20 6c 65 61 76 65 20 70 49 74  s case leave pIt
d370: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68  er->pLeaf==0, th
d380: 69 73 20 69 74 65 72 61 74 6f 72 20 69 73 20 61  is iterator is a
d390: 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20  t EOF. */.      
d3a0: 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  if( pIter->iLeaf
d3b0: 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65  Pgno==pIter->iTe
d3c0: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
d3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d3e0: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b  ter->pLeaf==0 );
d3f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
d400: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
d410: 73 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66  set<pNew->szLeaf
d420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
d430: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
d440: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
d450: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d460: 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  = pIter->iTermLe
d470: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  afOffset;.      
d480: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
d490: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
d4a0: 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  widOff;.        
d4b0: 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
d4c0: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
d4d0: 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  f(pNew);.       
d4e0: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
d4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
d500: 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b  r->pLeaf = pNew;
d510: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d520: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d530: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
d540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
d550: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
d560: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
d570: 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e  u8 *a = &pIter->
d580: 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e  pLeaf->p[pIter->
d590: 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
d5a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
d5b0: 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35  afOffset += fts5
d5c0: 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36  GetVarint(a, (u6
d5d0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
d5e0: 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
d5f0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
d600: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
d610: 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
d620: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d630: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
d640: 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65  Leaf ){.    pIte
d650: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
d660: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
d670: 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53  >nn+1;.    fts5S
d680: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
d690: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
d6a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
d6b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
d6c0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
d6d0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
d6e0: 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  rgument currentl
d6f0: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  y.** points to a
d700: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20   delete marker. 
d710: 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20  A delete marker 
d720: 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  is an entry with
d730: 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73   a 0 byte.** pos
d740: 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73  ition-list..*/.s
d750: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
d760: 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46  ltiIterIsEmpty(F
d770: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
d780: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
d790: 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  r){.  Fts5SegIte
d7a0: 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
d7b0: 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46  ->aSeg[pIter->aF
d7c0: 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
d7d0: 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
d7e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
d7f0: 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53  Seg->pLeaf && pS
d800: 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a  eg->nPos==0);.}.
d810: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  ./*.** Advance i
d820: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f  terator pIter to
d830: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
d840: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
d850: 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
d860: 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
d870: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
d880: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74  e error code. It
d890: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73   .** is not cons
d8a0: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
d8b0: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
d8c0: 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20  reaches EOF. If 
d8d0: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
d8e0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
d8f0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
d900: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
d910: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
d920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
d930: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20  s5SegIterNext(. 
d940: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
d970: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
d980: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9a0: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
d9b0: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nce */.  int *pb
d9c0: 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20  NewTerm         
d9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
d9e0: 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72   Set for new ter
d9f0: 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  m */.){.  assert
da00: 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c  ( pbNewTerm==0 |
da10: 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  | *pbNewTerm==0 
da20: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
da30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
da40: 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
da50: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
da60: 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20 20  _REVERSE ){.    
da70: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
da80: 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
da90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
daa0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
dac0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
dad0: 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ->p;.        int
dae0: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69   iOff;.        i
daf0: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
db00: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
db10: 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
db20: 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ..        pIter-
db30: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b  >iRowidOffset--;
db40: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
db50: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
db60: 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77  ff = pIter->aRow
db70: 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e  idOffset[pIter->
db80: 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20  iRowidOffset];. 
db90: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
dba0: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
dbb0: 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
dbc0: 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
dbd0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
dbe0: 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47  s;.        fts5G
dbf0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
dc00: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
dc10: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
dc20: 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c  ->iRowid -= iDel
dc30: 74 61 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ta;.        fts5
dc40: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
dc50: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
dc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dc70: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
dc80: 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
dc90: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
dca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74   }else{.      Ft
dcb0: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
dcc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20  pIter->pLeaf;.  
dcd0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
dce0: 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
dcf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
dd00: 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20  nKeep = 0;..    
dd10: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
dd20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
dd30: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74  osition list wit
dd40: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
dd50: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75  page. */.      u
dd60: 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b  8 *a = pLeaf->p;
dd70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
dd80: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20  Leaf->szLeaf;.. 
dd90: 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45       ASSERT_SZLE
dda0: 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
ddb0: 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72      iOff = pIter
ddc0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20  ->iLeafOffset + 
ddd0: 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20  pIter->nPos;..  
dde0: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
ddf0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
de00: 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   next entry is o
de10: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
de20: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ge. */.        a
de30: 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d  ssert_nc( iOff<=
de40: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
de50: 6c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  list );.        
de60: 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d  if( iOff>=pIter-
de70: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29  >iEndofDoclist )
de80: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65 77  {.          bNew
de90: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
dea0: 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74      if( iOff!=ft
deb0: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
dec0: 66 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20  ff(pLeaf) ){.   
ded0: 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
dee0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
def0: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
df00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
df10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
df20: 20 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c          u64 iDel
df30: 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ta;.          iO
df40: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
df50: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
df60: 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20  ff], &iDelta);. 
df70: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
df80: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
df90: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
dfa0: 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20  rt_nc( iDelta>0 
dfb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dfc0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
dfd0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
dfe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dff0: 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20   pIter->pSeg==0 
e000: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
e010: 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a   u8 *pList = 0;.
e020: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
e030: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20  ar *zTerm = 0;. 
e040: 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74         int nList
e050: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73   = 0;.        as
e060: 73 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c  sert( (pIter->fl
e070: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e080: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70  ER_ONETERM) || p
e090: 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20  bNewTerm );.    
e0a0: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65      if( 0==(pIte
e0b0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
e0c0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
e0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e0e0: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
e0f0: 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b  nNext(p->pHash);
e100: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e110: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
e120: 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a  try(p->pHash, &z
e130: 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
e140: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
e150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69  .        if( pLi
e160: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
e170: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
e180: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
e190: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e1a0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
e1b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e1c0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e1d0: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
e1e0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ist;.          p
e1f0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
e200: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = nList;.       
e210: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e220: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
e230: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e240: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
e250: 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20  = nList+1;.     
e260: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
e270: 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
e280: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
e290: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
e2a0: 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  m),.            
e2b0: 20 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20    (u8*)zTerm);. 
e2c0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e2d0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
e2e0: 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73  s5GetVarint(pLis
e2f0: 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  t, (u64*)&pIter-
e300: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
e310: 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
e320: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
e330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e340: 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20     iOff = 0;.   
e350: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74       /* Next ent
e360: 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  ry is not on the
e370: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f   current page */
e380: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
e390: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
e3a0: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
e3b0: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
e3c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  r);.          pL
e3d0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
e3e0: 61 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  af;.          if
e3f0: 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ( pLeaf==0 ) bre
e400: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53  ak;.          AS
e410: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
e420: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
e430: 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73   if( (iOff = fts
e440: 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
e450: 66 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f  ff(pLeaf)) && iO
e460: 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff<pLeaf->szLeaf
e470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e480: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
e490: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
e4a0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
e4b0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
e4c0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
e4d0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e4e0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20  set = iOff;..   
e4f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
e500: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
e510: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e520: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67        pIter->iPg
e530: 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e  idxOff = pLeaf->
e540: 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74  szLeaf + fts5Get
e550: 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20  Varint32(.      
e560: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
e570: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
e580: 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e  eaf], pIter->iEn
e590: 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20  dofDoclist.     
e5a0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e5b0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
e5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e5d0: 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d   else if( pLeaf-
e5e0: 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  >nn>pLeaf->szLea
e5f0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
e600: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
e610: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
e620: 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  f + fts5GetVarin
e630: 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20  t32(.           
e640: 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70       &pLeaf->p[p
e650: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69  Leaf->szLeaf], i
e660: 4f 66 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  Off.            
e670: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e680: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e690: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
e6a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
e6b0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66  dofDoclist = iOf
e6c0: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  f;.            b
e6d0: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
e6e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e6f0: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
e700: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
e710: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
e720: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
e730: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e740: 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
e750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e760: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
e770: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
e780: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
e790: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
e7a0: 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  arly. */.      i
e7b0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
e7c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ){.        if( b
e7d0: 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
e7e0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
e7f0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e800: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a  ITER_ONETERM ){.
e810: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
e820: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
e830: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
e840: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e850: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
e860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e870: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e880: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
e890: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
e8a0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
e8b0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
e8c0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
e8d0: 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
e8e0: 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
e8f0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
e900: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e910: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
e920: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62  ollowing could b
e930: 65 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  e done by callin
e940: 67 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  g fts5SegIterLoa
e950: 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20  dNPos(). But.   
e960: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62         ** this b
e970: 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75 6c  lock is particul
e980: 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63 65  arly performance
e990: 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65 71   critical, so eq
e9a0: 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20  uivalent.       
e9b0: 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e     ** code is in
e9c0: 6c 69 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lined. */.      
e9d0: 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20      int nSz;.   
e9e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e9f0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ea00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
ea10: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
ea20: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  (pIter->pLeaf->p
ea30: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  , pIter->iLeafOf
ea40: 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  fset, nSz);.    
ea50: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
ea60: 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30  l = (nSz & 0x000
ea70: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  1);.          pI
ea80: 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
ea90: 3e 31 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  >1;.          as
eaa0: 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
eab0: 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 20  nPos>=0 );.     
eac0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ead0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e   }.  }.}..#defin
eae0: 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20  e SWAPVAL(T, a, 
eaf0: 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d  b) { T tmp; tmp=
eb00: 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d  a; a=b; b=tmp; }
eb10: 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
eb20: 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
eb30: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
eb40: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20  irst rowid in a 
eb50: 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a  doclist. This.**
eb60: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
eb70: 68 65 20 69 74 65 72 61 74 6f 72 20 75 70 20 73  he iterator up s
eb80: 6f 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20  o that iterates 
eb90: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
eba0: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20   through.** the 
ebb0: 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  doclist..*/.stat
ebc0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
ebd0: 74 65 72 52 65 76 65 72 73 65 28 46 74 73 35 49  terReverse(Fts5I
ebe0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
ebf0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ec00: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
ec10: 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Dlidx = pIter->p
ec20: 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74  Dlidx;.  Fts5Dat
ec30: 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  a *pLast = 0;.  
ec40: 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
ec50: 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20  ;..  if( pDlidx 
ec60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
ec70: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
ec80: 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e  >iSegid;.    pgn
ec90: 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64  oLast = fts5Dlid
eca0: 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
ecb0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66  );.    pLast = f
ecc0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
ecd0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
ece0: 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61  D(iSegid, pgnoLa
ecf0: 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st));.  }else{. 
ed00: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
ed10: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
ed20: 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  f;         /* Cu
ed30: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
ed40: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  */..    /* Curre
ed50: 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65  ntly, Fts5SegIte
ed60: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
ed70: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
ed80: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a  t byte of.    **
ed90: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
eda0: 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63  ontent for the c
edb0: 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61  urrent rowid. Ba
edc0: 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74  ck it up so that
edd0: 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74   it.    ** point
ede0: 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
edf0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
ee00: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
ee10: 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  */.    pIter->iL
ee20: 65 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c  eafOffset -= sql
ee30: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
ee40: 74 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73  tLen(pIter->nPos
ee50: 2a 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b  *2+pIter->bDel);
ee60: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
ee70: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
ee80: 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67  ue then the larg
ee90: 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  est rowid for th
eea0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
eeb0: 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65   term may not be
eec0: 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
eed0: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20  urrent page. So 
eee0: 73 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74  search forward t
eef0: 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65  o.    ** see whe
ef00: 72 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65  re said rowid re
ef10: 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20  ally is.  */.   
ef20: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64   if( pIter->iEnd
ef30: 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66  ofDoclist>=pLeaf
ef40: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
ef50: 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20    int pgno;.    
ef60: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
ef70: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
ef80: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20  Iter->pSeg;..   
ef90: 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72     /* The last r
efa0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
efb0: 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ist may not be o
efc0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
efd0: 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20  ge. Search.     
efe0: 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66   ** forward to f
eff0: 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ind the page con
f000: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
f010: 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20   rowid.  */.    
f020: 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72    for(pgno=pIter
f030: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21  ->iLeafPgno+1; !
f040: 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70  p->rc && pgno<=p
f050: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70  Seg->pgnoLast; p
f060: 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  gno++){.        
f070: 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f  i64 iAbs = FTS5_
f080: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
f090: 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f  eg->iSegid, pgno
f0a0: 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44  );.        Fts5D
f0b0: 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35  ata *pNew = fts5
f0c0: 44 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73  DataRead(p, iAbs
f0d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f0e0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
f0f0: 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65   int iRowid, bTe
f100: 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20  rmless;.        
f110: 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c    iRowid = fts5L
f120: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
f130: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
f140: 20 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74    bTermless = ft
f150: 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73  s5LeafIsTermless
f160: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
f170: 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a    if( iRowid ){.
f180: 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50              SWAP
f190: 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70  VAL(Fts5Data*, p
f1a0: 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20  New, pLast);.   
f1b0: 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73           pgnoLas
f1c0: 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  t = pgno;.      
f1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f1e0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
f1f0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
f200: 20 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d   if( bTermless==
f210: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f220: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f230: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f240: 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74  pLast is NULL at
f250: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
f260: 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  n the last rowid
f270: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
f280: 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74  t.  ** lies on t
f290: 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
f2a0: 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
f2b0: 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20  he iterator. In 
f2c0: 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20  this case .  ** 
f2d0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f2e0: 65 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  et is already se
f2f0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
f300: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
f310: 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  size.  ** field 
f320: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f330: 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61  the first releva
f340: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
f350: 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
f360: 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20  Or, if pLast is 
f370: 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  non-NULL, then i
f380: 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
f390: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
f3a0: 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e  last.  ** rowid.
f3b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f   In this case co
f3c0: 6e 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72  nfigure the iter
f3d0: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  ator so that it 
f3e0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20  points to the.  
f3f0: 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  ** first rowid o
f400: 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a  n this page..  *
f410: 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b  /.  if( pLast ){
f420: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
f430: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
f440: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
f450: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
f460: 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  af = pLast;.    
f470: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
f480: 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
f490: 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
f4a0: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
f4b0: 61 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  ast);.    iOff +
f4c0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
f4d0: 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLast->p[iOff],
f4e0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
f4f0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65  Rowid);.    pIte
f500: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f510: 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20   iOff;..    if( 
f520: 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
f530: 73 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20  ss(pLast) ){.   
f540: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
f550: 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d  Doclist = pLast-
f560: 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  >nn+1;.    }else
f570: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
f580: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66  EndofDoclist = f
f590: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
f5a0: 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  Off(pLast);.    
f5b0: 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65  }..  }..  fts5Se
f5c0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
f5d0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
f5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
f5f0: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
f600: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
f610: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61  first rowid of a
f620: 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65   doclist..** The
f630: 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
f640: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
f650: 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
f660: 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72  term on the curr
f670: 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66  ent .** page. If
f680: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
f690: 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65  m is the last te
f6a0: 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  rm on the page, 
f6b0: 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63  load the .** doc
f6c0: 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20  list-index from 
f6d0: 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c  disk and initial
f6e0: 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ize an iterator 
f6f0: 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64  at (pIter->pDlid
f700: 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x)..*/.static vo
f710: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
f720: 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  adDlidx(Fts5Inde
f730: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
f740: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
f750: 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70   iSeg = pIter->p
f760: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69  Seg->iSegid;.  i
f770: 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
f780: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f790: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
f7a0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
f7b0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
f7c0: 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65  f; /* Current le
f7d0: 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73  af data */..  as
f7e0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
f7f0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f800: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
f810: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
f820: 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lidx==0 );..  /*
f830: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75   Check if the cu
f840: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e  rrent doclist en
f850: 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ds on this page.
f860: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74   If it does, ret
f870: 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77  urn.  ** early w
f880: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74  ithout loading t
f890: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
f8a0: 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20   (as it belongs 
f8b0: 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20  to a different. 
f8c0: 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69   ** term. */.  i
f8d0: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
f8e0: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
f8f0: 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26  iLeafPgno .   &&
f900: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
f910: 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c  clist<pLeaf->szL
f920: 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  eaf .  ){.    re
f930: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74  turn;.  }..  pIt
f940: 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73  er->pDlidx = fts
f950: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
f960: 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49  , bRev, iSeg, pI
f970: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
f980: 6e 6f 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  no);.}..#define 
f990: 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
f9a0: 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20  int(a, iOff) {  
f9b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e            \.  in
f9c0: 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b  t iEnd = iOff+9;
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
f9f0: 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66    while( (a[iOff
fa00: 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20 69  ++] & 0x80) && i
fa10: 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20  Off<iEnd );     
fa20: 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    \.}../*.** The
fa30: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
fa40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
fa50: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
fa60: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
fa70: 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61  s.** no valid va
fa80: 6c 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20  lues except for 
fa90: 74 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e  the Fts5SegIter.
faa0: 70 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72  pLeaf member var
fab0: 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66  iable. This.** f
fac0: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
fad0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66   the leaf page f
fae0: 6f 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69  or a term matchi
faf0: 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ng (pTerm/nTerm)
fb00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
fb10: 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73  pecified term is
fb20: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61   found on the pa
fb30: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ge, then the ite
fb40: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  rator is left.**
fb50: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
fb60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65   If argument bGe
fb70: 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
fb80: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75   term is not fou
fb90: 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61  nd,.** the itera
fba0: 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
fbb0: 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  ting at EOF..**.
fbc0: 2a 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e  ** If bGe is non
fbd0: 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70  -zero and the sp
fbe0: 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
fbf0: 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
fc00: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
fc10: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
fc20: 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
fc30: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
fc40: 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20  ment that.** is 
fc50: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
fc60: 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20  specified term, 
fc70: 65 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72  even if this ter
fc80: 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a  m is not on the.
fc90: 2a 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  ** current page.
fca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fcb0: 66 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20  fts5LeafSeek(.  
fcc0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  /* Leave any err
fcf0: 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a  or code here */.
fd00: 20 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20    int bGe,      
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
fd30: 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46  >= search */.  F
fd40: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
fd50: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
fd60: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65  * Iterator to se
fd70: 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ek */.  const u8
fd80: 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
fd90: 72 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm      /* Term 
fda0: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
fdb0: 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
fdc0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
fdd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
fde0: 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20  .  int szLeaf = 
fdf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
fe00: 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Leaf;.  int n = 
fe10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
fe20: 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20  ;..  int nMatch 
fe30: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70  = 0;.  int nKeep
fe40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77   = 0;.  int nNew
fe50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72   = 0;.  int iTer
fe60: 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69  mOff;.  int iPgi
fe70: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
fe80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
fe90: 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  nt offset in pgi
fea0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64  dx */.  int bEnd
feb0: 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  OfPage = 0;..  a
fec0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
fed0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50  LITE_OK );..  iP
fee0: 67 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  gidx = szLeaf;. 
fef0: 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
ff00: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
ff10: 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29  gidx], iTermOff)
ff20: 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d  ;.  iOff = iTerm
ff30: 4f 66 66 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  Off;..  while( 1
ff40: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   ){..    /* Figu
ff50: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
ff60: 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e  new bytes are in
ff70: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
ff80: 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
ff90: 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
ffa0: 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  New);.    if( nK
ffb0: 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20  eep<nMatch ){.  
ffc0: 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
ffd0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
ffe0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70     assert( nKeep
fff0: 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20  >=nMatch );.    
10000 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63  if( nKeep==nMatc
10010 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  h ){.      int n
10020 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Cmp;.      int i
10030 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d  ;.      nCmp = M
10040 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
10050 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
10060 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
10070 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10080 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
10090 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
100a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
100b0 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
100c0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
100d0 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
100e0 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
100f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
10100 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
10110 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10120 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10130 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
10140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10150 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
10160 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
10170 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
10180 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
10190 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
101a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
101b0 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
101c0 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
101d0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
101e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
101f0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
10200 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
10210 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
10220 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
10230 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
10240 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  mOff;..    /* Re
10250 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65  ad the nKeep fie
10260 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ld of the next t
10270 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  erm. */.    fts5
10280 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
10290 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b  a, iOff, nKeep);
102a0 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61  .  }.. search_fa
102b0 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d  iled:.  if( bGe=
102c0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  =0 ){.    fts5Da
102d0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
102e0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
102f0 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
10300 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
10310 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67  se if( bEndOfPag
10320 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e ){.    do {.  
10330 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
10340 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
10350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
10360 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  er->pLeaf==0 ) r
10370 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d  eturn;.      a =
10380 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
10390 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
103a0 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
103b0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20  Iter->pLeaf)==0 
103c0 29 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64  ){.        iPgid
103d0 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  x = pIter->pLeaf
103e0 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  ->szLeaf;.      
103f0 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
10400 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
10410 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67  er->pLeaf->p[iPg
10420 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20  idx], iOff);.   
10430 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
10440 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  || iOff>=pIter->
10450 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
10460 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
10470 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
10480 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10490 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20            nKeep 
104a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
104b0 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  TermOff = iOff;.
104c0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49            n = pI
104d0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
104e0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
104f0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
10500 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
10510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
10520 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
10530 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
10540 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  ( 1 );.  }.. sea
10550 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20  rch_success:..  
10560 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10570 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
10580 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
10590 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
105a0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
105b0 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
105c0 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
105d0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66  >iLeafPgno;..  f
105e0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
105f0 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
10600 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29  m, nKeep, pTerm)
10610 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
10620 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
10630 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
10640 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
10650 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e  .  if( iPgidx>=n
10660 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
10670 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
10680 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
10690 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
106a0 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
106b0 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
106c0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
106d0 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20  idx], nExtra);. 
106e0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
106f0 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f  Doclist = iTermO
10700 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d  ff + nExtra;.  }
10710 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78  .  pIter->iPgidx
10720 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20  Off = iPgidx;.. 
10730 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
10740 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
10750 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
10760 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
10770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
10780 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
10790 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
107a0 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
107b0 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
107c0 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74  nt.** pSeg. If t
107d0 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
107e0 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
107f0 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  x, the iterator 
10800 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
10810 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10820 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
10830 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
10840 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
10850 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
10860 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
10870 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
10880 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
10890 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
108a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
108b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
108c0 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
108d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108f0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
10900 6e 64 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  nd */.  Fts5Buff
10910 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
10920 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
10930 72 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 61  r to use for loa
10940 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
10950 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
10960 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
10970 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
10980 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
10990 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
109a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
109b0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
109c0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
109d0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
109e0 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
109f0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
10a00 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
10a10 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
10a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
10a30 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
10a40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67   */.){.  int iPg
10a50 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20   = 1;.  int bGe 
10a60 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
10a70 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
10a80 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
10a90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10aa0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
10ab0 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
10ac0 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74  t-index */..  st
10ad0 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d  atic int nCall =
10ae0 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a   0;.  nCall++;..
10af0 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
10b00 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
10b10 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
10b20 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
10b30 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
10b40 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
10b50 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
10b60 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
10b70 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
10b80 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
10b90 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
10ba0 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
10bb0 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
10bc0 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
10bd0 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
10be0 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
10bf0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
10c00 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
10c10 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  if( p->pIdxSelec
10c20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  t==0 ){.    Fts5
10c30 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
10c40 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
10c50 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
10c60 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
10c70 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65  dxSelect, sqlite
10c80 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
10c90 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e       "SELECT pgn
10ca0 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  o FROM '%q'.'%q_
10cb0 69 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20  idx' WHERE ".   
10cc0 20 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20         "segid=? 
10cd0 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45  AND term<=? ORDE
10ce0 52 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c  R BY term DESC L
10cf0 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20  IMIT 1",.       
10d00 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
10d10 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
10d20 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66      ));.  }.  if
10d30 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
10d40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
10d50 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  _int(p->pIdxSele
10d60 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65  ct, 1, pSeg->iSe
10d70 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  gid);.  sqlite3_
10d80 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64  bind_blob(p->pId
10d90 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72  xSelect, 2, pTer
10da0 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45  m, nTerm, SQLITE
10db0 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
10dc0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
10dd0 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
10de0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
10df0 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33  64 val = sqlite3
10e00 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70  _column_int(p->p
10e10 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
10e20 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
10e30 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
10e40 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
10e50 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
10e60 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
10e70 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b  (p->pIdxSelect);
10e80 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67  ..  if( iPg<pSeg
10e90 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20  ->pgnoFirst ){. 
10ea0 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70     iPg = pSeg->p
10eb0 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44  gnoFirst;.    bD
10ec0 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lidx = 0;.  }.. 
10ed0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
10ee0 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66  o = iPg - 1;.  f
10ef0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
10f00 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  ge(p, pIter);.. 
10f10 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
10f20 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61  f ){.    fts5Lea
10f30 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49  fSeek(p, bGe, pI
10f40 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  ter, pTerm, nTer
10f50 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  m);.  }..  if( p
10f60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10f70 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  && bGe==0 ){.   
10f80 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
10f90 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
10fa0 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
10fb0 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
10fc0 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
10fd0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
10fe0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
10ff0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11000 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
11010 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  VERSE;.      }. 
11020 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20       if( bDlidx 
11030 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
11040 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
11050 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11060 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61   }.      if( fla
11070 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11080 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
11090 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
110a0 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72  Reverse(p, pIter
110b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
110c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
110d0 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  r:.  **.  **   1
110e0 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  ) an error has o
110f0 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a  ccurred, or.  **
11100 20 20 20 32 29 20 74 68 65 20 69 74 65 72 61 74     2) the iterat
11110 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
11120 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20 74  , or.  **   3) t
11130 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
11140 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77  ts to an entry w
11150 69 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ith term (pTerm/
11160 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20  nTerm), or.  ** 
11170 20 20 34 29 20 74 68 65 20 46 54 53 35 49 4e 44    4) the FTS5IND
11180 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66 6c  EX_QUERY_SCAN fl
11190 61 67 20 77 61 73 20 73 65 74 20 61 6e 64 20 74  ag was set and t
111a0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
111b0 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  ts.  **      to 
111c0 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
111d0 74 65 72 6d 20 67 72 65 61 74 65 72 20 74 68 61  term greater tha
111e0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28 70  n or equal to (p
111f0 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a  Term/nTerm)..  *
11200 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  /.  assert( p->r
11210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  c!=SQLITE_OK    
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20        /* 1 */.  
11250 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   || pIter->pLeaf
11260 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20    /* 2 */.   || 
112a0 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
112b0 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65  eBlob(&pIter->te
112c0 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, pTerm, nTerm
112d0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f 2a  )==0          /*
112e0 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65   3 */.   || (bGe
112f0 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
11300 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
11310 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
11320 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a  Term)>0)  /* 4 *
11330 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  /.  );.}../*.** 
11340 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
11350 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
11360 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
11370 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
11380 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
11390 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
113a0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
113b0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73   term in the has
113c0 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a  h-table, the .**
113d0 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74   iterator is set
113e0 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   to EOF..**.** I
113f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11400 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
11410 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
11420 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
11430 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
11440 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
11450 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
11460 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11470 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
11480 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11490 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
114a0 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73  rHashInit(.  Fts
114b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  FTS5 backend */.
114e0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
114f0 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
11500 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
11510 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
11520 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
11530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
11540 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
11550 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
11560 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11580 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
11590 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ate */.){.  cons
115a0 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
115b0 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30  .  int nList = 0
115c0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20  ;.  const u8 *z 
115d0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  = 0;.  int n = 0
115e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
115f0 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72  pHash );.  asser
11600 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
11610 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  _OK );..  if( pT
11620 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  erm==0 || (flags
11630 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
11640 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20  RY_SCAN) ){.    
11650 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
11660 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
11670 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
11680 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
11690 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  erm);.    sqlite
116a0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
116b0 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  ry(p->pHash, (co
116c0 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26  nst char**)&z, &
116d0 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
116e0 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e      n = (z ? (in
116f0 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20  t)strlen((const 
11700 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20  char*)z) : 0);. 
11710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
11720 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
11730 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
11740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
11750 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48  5HashQuery(p->pH
11760 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
11770 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  *)pTerm, nTerm, 
11780 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
11790 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a  .    z = pTerm;.
117a0 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20      n = nTerm;. 
117b0 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20   }..  if( pList 
117c0 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
117d0 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69  *pLeaf;.    sqli
117e0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
117f0 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
11800 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20  >term, n, z);.  
11810 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64    pLeaf = fts5Id
11820 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
11830 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20  f(Fts5Data));.  
11840 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
11850 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65   return;.    pLe
11860 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
11870 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e  st;.    pLeaf->n
11880 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
11890 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70  f = nList;.    p
118a0 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c  Iter->pLeaf = pL
118b0 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  eaf;.    pIter->
118c0 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
118d0 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 65 61  s5GetVarint(pLea
118e0 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74  f->p, (u64*)&pIt
118f0 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
11900 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
11910 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e  clist = pLeaf->n
11920 6e 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  n+1;..    if( fl
11930 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
11940 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
11950 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
11960 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
11970 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
11980 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
11990 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
119a0 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
119b0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
119c0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
119d0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
119e0 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68  }../*.** Zero th
119f0 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
11a00 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
11a10 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
11a20 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
11a30 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49  erClear(Fts5SegI
11a40 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66  ter *pIter){.  f
11a50 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
11a60 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66  Iter->term);.  f
11a70 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
11a80 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
11a90 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11aa0 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
11ab0 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74  );.  fts5DlidxIt
11ac0 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44  erFree(pIter->pD
11ad0 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  lidx);.  sqlite3
11ae0 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f  _free(pIter->aRo
11af0 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65  widOffset);.  me
11b00 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
11b10 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
11b20 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  r));.}..#ifdef S
11b30 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a  QLITE_DEBUG../*.
11b40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11b50 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
11b60 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73 65   of the big asse
11b70 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20 69  rt() procedure i
11b80 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a  mplemented by.**
11b90 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
11ba0 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74 20  IterSetup(). It 
11bb0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
11bc0 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c   result currentl
11bd0 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a  y stored.** in *
11be0 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72 72  pRes is the corr
11bf0 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  ect result of co
11c00 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72 72  mparing the curr
11c10 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  ent positions of
11c20 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72   the.** two iter
11c30 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ators..*/.static
11c40 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
11c50 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
11c60 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  (.  Fts5IndexIte
11c70 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73  r *pIter, .  Fts
11c80 35 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20  5SegIter *p1,.  
11c90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c  Fts5SegIter *p2,
11ca0 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a  .  Fts5CResult *
11cb0 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31  pRes.){.  int i1
11cc0 20 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61   = p1 - pIter->a
11cd0 53 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  Seg;.  int i2 = 
11ce0 70 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p2 - pIter->aSeg
11cf0 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  ;..  if( p1->pLe
11d00 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20  af || p2->pLeaf 
11d10 29 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70  ){.    if( p1->p
11d20 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
11d30 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
11d40 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20  First==i2 );.   
11d50 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70   }else if( p2->p
11d60 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
11d70 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
11d80 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
11d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
11da0 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d  t nMin = MIN(p1-
11db0 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72  >term.n, p2->ter
11dc0 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  m.n);.      int 
11dd0 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d  res = memcmp(p1-
11de0 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72  >term.p, p2->ter
11df0 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  m.p, nMin);.    
11e00 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
11e10 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20  es = p1->term.n 
11e20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20  - p2->term.n;.. 
11e30 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
11e40 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
11e50 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
11e60 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
11e70 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69  ssert( p1->iRowi
11e80 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b  d!=p2->iRowid );
11e90 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
11ea0 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
11eb0 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
11ec0 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31  ->bRev) ? -1 : 1
11ed0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11ee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11ef0 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
11f00 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
11f10 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
11f20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11f30 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
11f40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11f50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11f60 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
11f70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
11f80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
11f90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11fa0 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
11fb0 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
11fc0 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73  efined when this
11fd0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f   module.** is co
11fe0 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20  mpiled. In that 
11ff0 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  case, this funct
12000 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c  ion is essential
12010 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a  ly an assert() .
12020 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  ** statement use
12030 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
12040 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12050 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
12060 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  st[] array.** ar
12070 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  e correct..*/.st
12080 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
12090 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
120a0 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  up(Fts5Index *p,
120b0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
120c0 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
120d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
120e0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
120f0 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74  r *pFirst = &pIt
12100 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
12110 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
12120 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ];.    int i;.
12130 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46  .    assert( (pF
12140 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d  irst->pLeaf==0)=
12150 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a  =pIter->bEof );.
12160 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
12170 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  at pIter->iSwitc
12180 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f  hRowid is set co
12190 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
121a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
121b0 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
121c0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
121d0 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
121e0 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  eg[i];.      ass
121f0 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20  ert( p1==pFirst 
12200 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
12210 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20  1->pLeaf==0 .   
12220 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42          || fts5B
12230 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46  ufferCompare(&pF
12240 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d  irst->term, &p1-
12250 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20  >term) .        
12260 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64     || p1->iRowid
12270 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
12280 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  Rowid.          
12290 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c   || (p1->iRowid<
122a0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
122b0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
122c0 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  v.      );.    }
122d0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
122e0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
122f0 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
12300 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
12310 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
12320 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
12330 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
12340 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46  eg[i+1];.      F
12350 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
12360 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
12370 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b  t[(pIter->nSeg +
12380 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20   i) / 2];.      
12390 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
123a0 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
123b0 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
123c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
123d0 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e  i=1; i<(pIter->n
123e0 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b  Seg / 2); i+=2){
123f0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
12400 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
12410 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
12420 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74  irst[i*2].iFirst
12430 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ];.      Fts5Se
12440 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
12450 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
12460 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69  >aFirst[i*2+1].i
12470 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
12480 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
12490 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
124a0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  t[i];.      fts5
124b0 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
124c0 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
124d0 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
124e0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
124f0 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65   define fts5Asse
12500 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
12510 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
12520 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61  .** Do the compa
12530 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20  rison necessary 
12540 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65  to populate pIte
12550 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e  r->aFirst[iOut].
12560 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
12570 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
12580 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
12590 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
125a0 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  f an entry.** in
125b0 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67   the pIter->aSeg
125c0 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73  [] array that is
125d0 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c   (a) not at EOF,
125e0 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e   and (b) pointin
125f0 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68  g.** to a key th
12600 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  at is a duplicat
12610 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69  e of another, hi
12620 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a  gher priority, .
12630 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61  ** segment-itera
12640 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d  tor in the pSeg-
12650 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aSeg[] array..*
12660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
12670 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
12680 61 72 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  are(Fts5IndexIte
12690 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f  r *pIter, int iO
126a0 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20  ut){.  int i1;  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
126d0 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73  of left-hand Fts
126e0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
126f0 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20  t i2;           
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12710 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
12720 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
12730 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a   */.  int iRes;.
12740 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
12750 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
12760 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46    /* Left-hand F
12770 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
12780 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b  Fts5SegIter *p2;
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74  /* Right-hand Ft
127b0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
127c0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
127d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
127e0 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65  t[iOut];..  asse
127f0 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e  rt( iOut<pIter->
12800 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29  nSeg && iOut>0 )
12810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
12820 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49  r->bRev==0 || pI
12830 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a  ter->bRev==1 );.
12840 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49  .  if( iOut>=(pI
12850 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a  ter->nSeg/2) ){.
12860 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d      i1 = (iOut -
12870 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20   pIter->nSeg/2) 
12880 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31  * 2;.    i2 = i1
12890 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
128a0 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61     i1 = pIter->a
128b0 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46  First[iOut*2].iF
128c0 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70  irst;.    i2 = p
128d0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
128e0 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  t*2+1].iFirst;. 
128f0 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72   }.  p1 = &pIter
12900 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32  ->aSeg[i1];.  p2
12910 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
12920 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54  i2];..  pRes->bT
12930 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28  ermEq = 0;.  if(
12940 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
12950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
12960 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p1 is at EOF */
12970 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a  .    iRes = i2;.
12980 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
12990 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
129a0 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45  /* If p2 is at E
129b0 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
129c0 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i1;.  }else{.  
129d0 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35    int res = fts5
129e0 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
129f0 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65  1->term, &p2->te
12a00 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  rm);.    if( res
12a10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
12a20 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20  ert( i2>i1 );.  
12a30 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d      assert( i2!=
12a40 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d  0 );.      pRes-
12a50 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20  >bTermEq = 1;.  
12a60 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77      if( p1->iRow
12a70 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id==p2->iRowid )
12a80 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44  {.        p1->bD
12a90 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20  el = p2->bDel;. 
12aa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32         return i2
12ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ac0 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
12ad0 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
12ae0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
12af0 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
12b00 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
12b10 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
12b20 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
12b30 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
12b40 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
12b50 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
12b60 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
12b70 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74  (u16)iRes;.  ret
12b80 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12b90 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
12ba0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
12bb0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
12bc0 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
12bd0 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
12be0 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
12bf0 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f  eaf iLeafPgno do
12c00 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
12c10 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69  contains no rowi
12c20 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
12c30 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
12c40 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
12c50 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12c70 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
12c80 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
12c90 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
12ca0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
12cb0 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
12cc0 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
12cd0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
12ce0 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
12cf0 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66  eafPgno );..  if
12d00 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
12d10 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  r->pSeg->pgnoLas
12d20 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
12d30 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
12d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
12d50 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
12d60 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
12d70 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
12d80 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  eaf = 0;.    pIt
12d90 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
12da0 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20  iLeafPgno-1;.   
12db0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
12dc0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
12dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
12de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
12df0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12e00 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
12e10 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12e30 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
12e40 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
12e50 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
12e60 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
12e70 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
12e80 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
12e90 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
12ea0 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
12eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
12ec0 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
12ed0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
12ee0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
12ef0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12f00 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
12f10 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
12f20 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
12f30 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
12f40 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
12f50 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
12f60 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12f70 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
12f80 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
12f90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12fa0 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
12fb0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
12fc0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12fd0 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
12fe0 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
12ff0 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
13000 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
13010 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
13020 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
13030 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
13040 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
13050 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13060 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
13070 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
13080 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13090 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
130a0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
130b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
130c0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
130d0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
130e0 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
130f0 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13110 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
13120 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
13130 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
13140 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
13150 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
13160 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
13170 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
13180 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
13190 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
131a0 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
131b0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
131c0 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
131d0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
131e0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
131f0 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
13200 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
13210 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
13220 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
13230 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
13240 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   ){.    while( !
13250 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
13260 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
13270 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49  Match>fts5DlidxI
13280 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
13290 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50   ){.      iLeafP
132a0 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
132b0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
132c0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
132d0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
132e0 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
132f0 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50  ssert_nc( iLeafP
13300 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
13310 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
13320 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
13330 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
13340 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
13350 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
13360 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
13370 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
13380 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
13390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
133a0 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  rt( pIter->pNext
133b0 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Leaf==0 );.    a
133c0 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49  ssert( iMatch<pI
133d0 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  ter->iRowid );. 
133e0 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
133f0 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13400 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
13410 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  <fts5DlidxIterRo
13420 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
13430 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
13440 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
13450 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
13460 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
13470 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
13480 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  x);..    assert(
13490 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
134a0 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
134b0 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
134c0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
134d0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
134e0 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
134f0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
13500 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
13510 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
13520 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
13530 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
13540 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
13550 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
13560 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  }..  do{.    if(
13570 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67   bMove ) fts5Seg
13580 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
13590 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
135a0 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
135b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
135c0 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72  bRev==0 && pIter
135d0 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  ->iRowid>=iMatch
135e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
135f0 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74  ( bRev!=0 && pIt
13600 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74  er->iRowid<=iMat
13610 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
13620 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68  bMove = 1;.  }wh
13630 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
13640 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  TE_OK );.}.../*.
13650 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72  ** Free the iter
13660 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
13670 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13680 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
13690 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
136a0 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35  ltiIterFree(Fts5
136b0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e  Index *p, Fts5In
136c0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
136d0 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
136e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
136f0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
13700 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
13710 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
13720 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
13730 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
13740 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
13750 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
13760 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  uct);.    fts5Bu
13770 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
13780 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73  >poslist);.    s
13790 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
137a0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
137b0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
137c0 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20  IterAdvanced(.  
137d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
13800 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
13810 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  n */.  Fts5Index
13820 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
13830 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13840 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
13850 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
13860 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
13870 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
13880 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13890 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
138a0 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20  st advanced */. 
138b0 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20   int iMinset    
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72   /* Minimum entr
138e0 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f  y in aFirst[] to
138f0 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
13900 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74   i;.  for(i=(pIt
13910 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
13920 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74  d)/2; i>=iMinset
13930 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
13940 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  E_OK; i=i/2){.  
13950 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69    int iEq;.    i
13960 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
13970 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
13980 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20  (pIter, i)) ){. 
13990 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
139a0 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  Next(p, &pIter->
139b0 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20  aSeg[iEq], 0);. 
139c0 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e       i = pIter->
139d0 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20  nSeg + iEq;.    
139e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
139f0 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61  ub-iterator iCha
13a00 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72  nged of iterator
13a10 20 70 49 74 65 72 20 68 61 73 20 6a 75 73 74 20   pIter has just 
13a20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49  been advanced. I
13a30 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  t still.** point
13a40 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65  s to the same te
13a50 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74  rm though - just
13a60 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
13a70 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  id. This functio
13a80 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  n.** attempts to
13a90 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74   update the cont
13aa0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
13ab0 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f  r->aFirst[] acco
13ac0 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69  rdingly..** If i
13ad0 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73  t does so succes
13ae0 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74  sfully, 0 is ret
13af0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
13b00 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e   1..**.** If non
13b10 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
13b20 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  d, the caller sh
13b30 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75  ould call fts5Mu
13b40 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
13b50 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72  ).** on the iter
13b60 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68  ator instead. Th
13b70 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  at function does
13b80 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 69   the same as thi
13b90 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a  s one, except.**
13ba0 20 74 68 61 74 20 69 74 20 64 65 61 6c 73 20 77   that it deals w
13bb0 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63  ith more complic
13bc0 61 74 65 64 20 63 61 73 65 73 20 61 73 20 77 65  ated cases as we
13bd0 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ll..*/ .static i
13be0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
13bf0 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20  AdvanceRowid(.  
13c00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
13c30 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
13c40 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  n */.  Fts5Index
13c50 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
13c60 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13c70 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
13c80 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
13c90 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
13ca0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
13cb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13cc0 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
13cd0 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29  st advanced */.)
13ce0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
13cf0 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e  *pNew = &pIter->
13d00 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a  aSeg[iChanged];.
13d10 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f  .  if( pNew->iRo
13d20 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13d30 74 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28  tchRowid.   || (
13d40 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74  pNew->iRowid<pIt
13d50 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13d60 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20  )==pIter->bRev. 
13d70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13d80 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13d90 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
13da0 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e  >aSeg[iChanged ^
13db0 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49   0x0001];.    pI
13dc0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13dd0 64 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20  d = pIter->bRev 
13de0 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
13df0 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   : LARGEST_INT64
13e00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74  ;.    for(i=(pIt
13e10 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
13e20 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b  d)/2; 1; i=i/2){
13e30 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75  .      Fts5CResu
13e40 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
13e50 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20  r->aFirst[i];.. 
13e60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
13e70 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20  w->pLeaf );.    
13e80 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13e90 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f  bTermEq==0 || pO
13ea0 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  ther->pLeaf );..
13eb0 20 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e        if( pRes->
13ec0 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20  bTermEq ){.     
13ed0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f     if( pNew->iRo
13ee0 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f  wid==pOther->iRo
13ef0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
13f00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
13f10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
13f20 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65  ther->iRowid>pNe
13f30 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  w->iRowid)==pIte
13f40 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
13f50 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69       pIter->iSwi
13f60 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65  tchRowid = pOthe
13f70 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
13f80 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68       pNew = pOth
13f90 65 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  er;.        }els
13fa0 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69  e if( (pOther->i
13fb0 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77  Rowid>pIter->iSw
13fc0 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
13fd0 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
13fe0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69       pIter->iSwi
13ff0 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65  tchRowid = pOthe
14000 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
14010 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14020 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20     pRes->iFirst 
14030 3d 20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70  = (u16)(pNew - p
14040 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20  Iter->aSeg);.   
14050 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72     if( i==1 ) br
14060 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68  eak;..      pOth
14070 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
14080 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
14090 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69  [i ^ 0x0001].iFi
140a0 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  rst ];.    }.  }
140b0 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
140c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
140d0 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61  Iter->bEof varia
140e0 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ble based on the
140f0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75   state of the su
14100 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  b-iterators..*/.
14110 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14120 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
14130 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
14140 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
14150 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
14160 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
14170 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
14180 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62  st ];.  pIter->b
14190 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61  Eof = pSeg->pLea
141a0 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69  f==0;.  pIter->i
141b0 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53  SwitchRowid = pS
141c0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  eg->iRowid;.}../
141d0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
141e0 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
141f0 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
14200 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14210 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
14220 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
14230 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69  s5Index.rc. It i
14240 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  s not .** consid
14250 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
14260 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
14270 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66  aches EOF, or if
14280 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
14290 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74  t .** EOF when t
142a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
142b0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
142c0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
142d0 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
142e0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
142f0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
14300 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20  r,.  int bFrom, 
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
14330 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69  argument iFrom i
14340 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34  s valid */.  i64
14350 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20   iFrom          
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14370 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74  Advance at least
14380 20 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20   as far as this 
14390 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
143a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
143b0 20 20 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d      int bUseFrom
143c0 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20 64 6f   = bFrom;.    do
143d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69   {.      int iFi
143e0 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69  rst = pIter->aFi
143f0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  rst[1].iFirst;. 
14400 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72       int bNewTer
14410 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73  m = 0;.      Fts
14420 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
14430 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46   &pIter->aSeg[iF
14440 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73  irst];.      ass
14450 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
14460 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
14470 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70  f( bUseFrom && p
14480 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20  Seg->pDlidx ){. 
14490 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
144a0 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53  erNextFrom(p, pS
144b0 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20  eg, iFrom);.    
144c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
144d0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
144e0 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54  (p, pSeg, &bNewT
144f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  erm);.      }.. 
14500 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
14510 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
14520 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66  erm .       || f
14530 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
14540 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49 74 65  nceRowid(p, pIte
14550 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20 20 20  r, iFirst).     
14560 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
14570 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
14580 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
14590 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
145a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
145b0 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20  Eof(pIter);.    
145c0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73    }.      fts5As
145d0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
145e0 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  up(p, pIter);.. 
145f0 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20       bUseFrom = 
14600 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  0;.    }while( p
14610 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
14620 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
14630 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65  rIsEmpty(p, pIte
14640 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  r) );.  }.}..sta
14650 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14660 74 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46  tiIterNext2(.  F
14670 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
14680 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
14690 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e  Iter,.  int *pbN
146a0 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
146b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
146c0 54 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20  True if *might* 
146d0 62 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  be new term */.)
146e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
146f0 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b  r->bSkipEmpty );
14700 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
14710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
14720 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46  o {.      int iF
14730 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46  irst = pIter->aF
14740 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a  irst[1].iFirst;.
14750 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
14760 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
14770 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a  ->aSeg[iFirst];.
14780 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65        int bNewTe
14790 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66  rm = 0;..      f
147a0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
147b0 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72  , pSeg, &bNewTer
147c0 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  m);.      if( pS
147d0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
147e0 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20  bNewTerm .      
147f0 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
14800 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c  rAdvanceRowid(p,
14810 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a   pIter, iFirst).
14820 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14830 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
14840 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
14850 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
14860 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
14870 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
14880 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54  .        *pbNewT
14890 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
148a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
148b0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
148c0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
148d0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
148e0 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
148f0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73  .    }while( fts
14900 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
14910 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20  y(p, pIter) );. 
14920 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 46 74   }.}...static Ft
14930 73 35 49 6e 64 65 78 49 74 65 72 20 2a 66 74 73  s5IndexIter *fts
14940 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
14950 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
14980 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
14990 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  thin */.  int nS
149a0 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  eg.){.  Fts5Inde
149b0 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69  xIter *pNew;.  i
149c0 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
149e0 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
149f0 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72  = nSeg */..  for
14a00 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
14a10 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
14a20 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66  t*2);.  pNew = f
14a30 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
14a40 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
14a50 73 35 49 6e 64 65 78 49 74 65 72 29 20 2b 20 20  s5IndexIter) +  
14a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
14a70 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  ew */.      size
14a80 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20  of(Fts5SegIter) 
14a90 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20  * (nSlot-1) +   
14aa0 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20  /* pNew->aSeg[] 
14ab0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14ac0 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e  Fts5CResult) * n
14ad0 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20  Slot         /* 
14ae0 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a  pNew->aFirst[] *
14af0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  /.  );.  if( pNe
14b00 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
14b10 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20  Seg = nSlot;.   
14b20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
14b30 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
14b40 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
14b50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64  ;.    pNew->pInd
14b60 65 78 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 65  ex = p;.  }.  re
14b70 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
14b80 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
14b90 65 77 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ew Fts5IndexIter
14ba0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
14bb0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
14bc0 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
14bd0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61  erate through da
14be0 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20  ta in structure 
14bf0 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69  pStruct..** If i
14c00 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68  Level is -ve, th
14c10 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61  en all data in a
14c20 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d  ll segments is m
14c30 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c  erged. Or, if iL
14c40 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  evel.** is zero 
14c50 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61  or greater, data
14c60 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
14c70 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74  nSegment segment
14c80 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65  s on level iLeve
14c90 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a  l.** is merged..
14ca0 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
14cb0 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69  or initially poi
14cc0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
14cd0 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72   term/rowid entr
14ce0 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65  y in the .** ite
14cf0 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  rated data..*/.s
14d00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14d10 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46  ultiIterNew(.  F
14d20 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d40 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
14d50 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
14d60 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
14d70 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20  ure *pStruct,   
14d80 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
14d90 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69  re of specific i
14da0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ndex */.  int bS
14db0 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20 20  kipEmpty,       
14dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14dd0 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65  e to ignore dele
14de0 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74  te-keys */.  int
14df0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e10 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
14e20 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  XXX flags */.  c
14e30 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
14e40 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
14e50 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
14e60 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f  o (or NULL/0) */
14e70 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69     /* Level to i
14ea0 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61  terate (-1 for a
14eb0 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ll) */.  int nSe
14ec0 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
14ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14ee0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
14ef0 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e  o merge (iLevel>
14f00 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  =0) */.  Fts5Ind
14f10 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  exIter **ppOut  
14f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
14f30 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
14f40 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20  nt nSeg = 0;    
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
14f70 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65  ent-iters in use
14f80 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20   */.  int iIter 
14f90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14fa0 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e        /* */.  in
14fb0 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14fd0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
14fe0 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
14ff0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
15000 72 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b  r buf = {0,0,0};
15010 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
15020 20 75 73 65 64 20 62 79 20 66 74 73 35 53 65 67   used by fts5Seg
15030 49 74 65 72 53 65 65 6b 49 6e 69 74 28 29 20 2a  IterSeekInit() *
15040 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
15050 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20  eLevel *pLvl;.  
15060 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
15070 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  New;..  assert( 
15080 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65  (pTerm==0 && nTe
15090 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c  rm==0) || iLevel
150a0 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  <0 );..  /* Allo
150b0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
150c0 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67  he new multi-seg
150d0 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20  -iterator. */.  
150e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
150f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15100 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
15110 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
15120 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
15130 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
15140 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
15150 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d   );.      nSeg =
15160 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
15170 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b  nt;.      nSeg +
15180 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20  = (p->pHash ? 1 
15190 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : 0);.    }else{
151a0 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  .      nSeg = MI
151b0 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
151c0 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
151d0 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d  nSegment);.    }
151e0 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20  .  }.  *ppOut = 
151f0 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69  pNew = fts5Multi
15200 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65  IterAlloc(p, nSe
15210 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  g);.  if( pNew==
15220 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
15230 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28  ew->bRev = (0!=(
15240 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
15250 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a  X_QUERY_DESC));.
15260 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70    pNew->bSkipEmp
15270 74 79 20 3d 20 28 75 38 29 62 53 6b 69 70 45 6d  ty = (u8)bSkipEm
15280 70 74 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74  pty;.  pNew->pSt
15290 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
152a0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
152b0 65 66 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  ef(pStruct);..  
152c0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65 61  /* Initialize ea
152d0 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e  ch of the compon
152e0 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65 72  ent segment iter
152f0 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ators. */.  if( 
15300 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
15310 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
15320 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72  el *pEnd = &pStr
15330 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  uct->aLevel[pStr
15340 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
15350 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29    if( p->pHash )
15360 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61  {.      /* Add a
15370 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
15380 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  r for the curren
15390 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
153a0 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  e hash table. */
153b0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
153c0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
153d0 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
153e0 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
153f0 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20 70  terHashInit(p, p
15400 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
15410 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  gs, pIter);.    
15420 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26  }.    for(pLvl=&
15430 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
15440 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70  0]; pLvl<pEnd; p
15450 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  Lvl++){.      fo
15460 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65  r(iSeg=pLvl->nSe
15470 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
15480 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 46  eg--){.        F
15490 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
154a0 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
154b0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
154c0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
154d0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
154e0 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
154f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
15500 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm==0 ){.      
15510 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
15520 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49 74  nit(p, pSeg, pIt
15530 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  er);.        }el
15540 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74  se{.          ft
15550 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69  s5SegIterSeekIni
15560 74 28 70 2c 20 26 62 75 66 2c 20 70 54 65 72 6d  t(p, &buf, pTerm
15570 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
15580 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
15590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
155a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
155b0 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
155c0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65  ct->aLevel[iLeve
155d0 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67  l];.    for(iSeg
155e0 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30  =nSeg-1; iSeg>=0
155f0 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20  ; iSeg--){.     
15600 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
15610 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  (p, &pLvl->aSeg[
15620 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53  iSeg], &pNew->aS
15630 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20  eg[iIter++]);.  
15640 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
15650 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b  ( iIter==nSeg );
15660 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
15670 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ove was successf
15680 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  ul, each compone
15690 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77  nt iterators now
156a0 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f   points .  ** to
156b0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
156c0 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e   in its segment.
156d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
156e0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20  itialize the .  
156f0 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
15700 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  y. Or, if an err
15710 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
15720 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74   free the iterat
15730 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61  or.  ** object a
15740 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  nd set the outpu
15750 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
15760 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LL.  */.  if( p-
15770 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15780 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d  {.    for(iIter=
15790 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49  pNew->nSeg-1; iI
157a0 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b  ter>0; iIter--){
157b0 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  .      int iEq;.
157c0 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d        if( (iEq =
157d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
157e0 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49  Compare(pNew, iI
157f0 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ter)) ){.       
15800 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
15810 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  (p, &pNew->aSeg[
15820 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
15830 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
15840 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c  dvanced(p, pNew,
15850 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20   iEq, iIter);.  
15860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15870 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
15880 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 66  Eof(pNew);.    f
15890 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
158a0 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29  erSetup(p, pNew)
158b0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
158c0 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
158d0 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
158e0 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a  pty(p, pNew) ){.
158f0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
15900 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c  terNext(p, pNew,
15910 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
15920 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d  }else{.    fts5M
15930 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
15940 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75  pNew);.    *ppOu
15950 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 74 73  t = 0;.  }.  fts
15960 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
15970 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
15980 74 65 20 61 6e 20 46 74 73 35 49 6e 64 65 78 49  te an Fts5IndexI
15990 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65  ter that iterate
159a0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f  s through the do
159b0 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a  clist provided.*
159c0 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
159d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
159e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
159f0 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74  tiIterNew2(.  Ft
15a00 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a20 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
15a30 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
15a40 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
15a50 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
15a60 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
15a70 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
15a80 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  gh */.  int bDes
15a90 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
15aa0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15ab0 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72  for descending r
15ac0 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  owid order */.  
15ad0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
15ae0 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
15af0 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
15b00 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  .){.  Fts5IndexI
15b10 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  ter *pNew;.  pNe
15b20 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
15b30 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20  rAlloc(p, 2);.  
15b40 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
15b50 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
15b60 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
15b70 5b 31 5d 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e  [1];..    pNew->
15b80 62 46 69 6c 74 65 72 65 64 20 3d 20 31 3b 0a 20  bFiltered = 1;. 
15b90 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
15ba0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
15bb0 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
15bc0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20  pData->szLeaf>0 
15bd0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
15be0 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  pLeaf = pData;. 
15bf0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
15c00 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
15c10 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70  tVarint(pData->p
15c20 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
15c30 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70  iRowid);.      p
15c40 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
15c50 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b  ist = pData->nn;
15c60 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69  .      pNew->aFi
15c70 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20  rst[1].iFirst = 
15c80 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65  1;.      if( bDe
15c90 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  sc ){.        pN
15ca0 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20  ew->bRev = 1;.  
15cb0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
15cc0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
15cd0 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
15ce0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
15cf0 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
15d00 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
15d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
15d20 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
15d30 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
15d40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74      }.      pDat
15d50 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
15d60 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 45  {.      pNew->bE
15d70 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  of = 1;.    }.. 
15d80 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77     *ppOut = pNew
15d90 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
15da0 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
15db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15dc0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
15dd0 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20  rator is at EOF 
15de0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  or if an error h
15df0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a  as occurred. .**
15e00 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
15e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15e20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
15e30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
15e40 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
15e50 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
15e60 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20  p->rc .      || 
15e70 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  (pIter->aSeg[ pI
15e80 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15e90 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30  First ].pLeaf==0
15ea0 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 0a  )==pIter->bEof .
15eb0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70    );.  return (p
15ec0 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62  ->rc || pIter->b
15ed0 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Eof);.}../*.** R
15ee0 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20  eturn the rowid 
15ef0 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  of the entry tha
15f00 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
15f10 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a  urrently points.
15f20 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74  ** to. If the it
15f30 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
15f40 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
15f50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15f60 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  d the.** results
15f70 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
15f80 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  */.static i64 ft
15f90 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
15fa0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
15fb0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
15fc0 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  ( pIter->aSeg[ p
15fd0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15fe0 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29  iFirst ].pLeaf )
15ff0 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
16000 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
16010 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
16020 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ].iRowid;.}../*.
16030 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
16040 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
16050 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c   entry at or fol
16060 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a  lowing iMatch..*
16070 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
16080 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
16090 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
160a0 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65   *p, .  Fts5Inde
160b0 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  xIter *pIter, . 
160c0 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20   i64 iMatch.){. 
160d0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
160e0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
160f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
16100 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20  xt(p, pIter, 1, 
16110 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28  iMatch);.    if(
16120 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
16130 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72  f(p, pIter) ) br
16140 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  eak;.    iRowid 
16150 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
16160 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
16170 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
16180 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
16190 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
161a0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
161b0 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c  ev!=0 && iRowid<
161c0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
161d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
161e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
161f0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
16200 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61  ining the term a
16210 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
16220 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61  he .** entry tha
16230 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
16240 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
16250 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  to..*/.static co
16260 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74  nst u8 *fts5Mult
16270 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  iIterTerm(Fts5In
16280 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
16290 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35  int *pn){.  Fts5
162a0 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49  SegIter *p = &pI
162b0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
162c0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
162d0 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  st ];.  *pn = p-
162e0 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
162f0 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
16300 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16310 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20  ChunkIterate(.  
16320 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  /* Index object 
16350 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
16360 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20   *pSeg,         
16370 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20       /* Poslist 
16380 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  of this iterator
16390 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   */.  void *pCtx
163a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
163b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
163c0 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68   pointer for xCh
163d0 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  unk callback */.
163e0 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29    void (*xChunk)
163f0 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69  (Fts5Index*, voi
16400 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69  d*, const u8*, i
16410 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nt).){.  int nRe
16420 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20  m = pSeg->nPos; 
16430 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16440 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c  er of bytes stil
16450 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46  l to come */.  F
16460 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
16470 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b   0;.  u8 *pChunk
16480 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
16490 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
164a0 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68  fset];.  int nCh
164b0 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
164c0 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
164d0 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61  eaf - pSeg->iLea
164e0 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20  fOffset);.  int 
164f0 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65  pgno = pSeg->iLe
16500 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67  afPgno;.  int pg
16510 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 69  noSave = 0;..  i
16520 66 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20  f( (pSeg->flags 
16530 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
16540 45 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20  EVERSE)==0 ){.  
16550 20 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e    pgnoSave = pgn
16560 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  o+1;.  }..  whil
16570 65 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75  e( 1 ){.    xChu
16580 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75  nk(p, pCtx, pChu
16590 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20  nk, nChunk);.   
165a0 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b   nRem -= nChunk;
165b0 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
165c0 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
165d0 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a   if( nRem<=0 ){.
165e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
165f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67   }else{.      pg
16600 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74  no++;.      pDat
16610 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
16620 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
16630 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65  _ROWID(pSeg->pSe
16640 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29  g->iSegid, pgno)
16650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
16660 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
16670 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70       pChunk = &p
16680 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20  Data->p[4];.    
16690 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e    nChunk = MIN(n
166a0 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65  Rem, pData->szLe
166b0 61 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69  af - 4);.      i
166c0 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76  f( pgno==pgnoSav
166d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
166e0 65 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74  ert( pSeg->pNext
166f0 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Leaf==0 );.     
16700 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65     pSeg->pNextLe
16710 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
16720 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20      pData = 0;. 
16730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16740 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  .}..../*.** Allo
16750 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
16760 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74  nt-id for the st
16770 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
16780 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   The new segment
16790 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65 20 62  .** id must be b
167a0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36 35 33  etween 1 and 653
167b0 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e  35 inclusive, an
167c0 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
167d0 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75  ed by .** any cu
167e0 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69 6e 67  rrently existing
167f0 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61 20 66   segment. If a f
16800 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64 20 63  ree segment id c
16810 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a  annot be found,.
16820 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69  ** SQLITE_FULL i
16830 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
16840 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
16850 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
16860 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
16870 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20  n is a no-op. 0 
16880 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
16890 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
168a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
168b0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46 74  AllocateSegid(Ft
168c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
168d0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
168e0 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  ct){.  int iSegi
168f0 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  d = 0;..  if( p-
16900 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16910 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  {.    if( pStruc
16920 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53  t->nSegment>=FTS
16930 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b  5_MAX_SEGMENT ){
16940 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
16950 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
16960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69  }else{.      whi
16970 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  le( iSegid==0 ){
16980 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 76  .        int iLv
16990 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 20  l, iSeg;.       
169a0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
169b0 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32 29 2c  ess(sizeof(u32),
169c0 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29   (void*)&iSegid)
169d0 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67 69 64  ;.        iSegid
169e0 20 3d 20 69 53 65 67 69 64 20 26 20 28 28 31 20   = iSegid & ((1 
169f0 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  << FTS5_DATA_ID_
16a00 42 29 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 66  B)-1);.        f
16a10 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
16a20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
16a30 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
16a40 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
16a50 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
16a60 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
16a70 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
16a80 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
16a90 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
16aa0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
16ab0 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
16ac0 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69             iSegi
16ad0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
16ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16af0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16b00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16b10 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d  return iSegid;.}
16b20 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
16b30 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74  all data current
16b40 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  ly cached in the
16b50 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f   hash-tables..*/
16b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16b70 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
16b80 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  a(Fts5Index *p){
16b90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48  .  assert( p->pH
16ba0 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69  ash || p->nPendi
16bb0 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69  ngData==0 );.  i
16bc0 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20  f( p->pHash ){. 
16bd0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
16be0 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68  shClear(p->pHash
16bf0 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
16c00 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a  ngData = 0;.  }.
16c10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16c20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
16c30 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73  prefix, in bytes
16c40 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28 6e  , that buffer (n
16c50 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65 73  New/pNew) shares
16c60 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72 20  .** with buffer 
16c70 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a  (nOld/pOld)..*/.
16c80 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
16c90 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20  refixCompress(. 
16ca0 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74   int nOld, const
16cb0 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74   u8 *pOld,.  int
16cc0 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38 20   nNew, const u8 
16cd0 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69  *pNew.){.  int i
16ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35  ;.  assert( fts5
16cf0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f 6c 64  BlobCompare(pOld
16d00 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e  , nOld, pNew, nN
16d10 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69  ew)<0 );.  for(i
16d20 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
16d30 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69  {.    if( pOld[i
16d40 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65  ]!=pNew[i] ) bre
16d50 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
16d60 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   i;.}..static vo
16d70 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
16d80 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49 6e  xClear(.  Fts5In
16d90 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
16da0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
16db0 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 20  r,.  int bFlush 
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
16de0 20 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f 20   write dlidx to 
16df0 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  disk */.){.  int
16e00 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62 46   i;.  assert( bF
16e10 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69  lush==0 || (pWri
16e20 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26  ter->nDlidx>0 &&
16e30 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16e40 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a  [0].buf.n>0) );.
16e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72    for(i=0; i<pWr
16e60 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b  iter->nDlidx; i+
16e70 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  +){.    Fts5Dlid
16e80 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
16e90 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
16ea0 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  dx[i];.    if( p
16eb0 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20  Dlidx->buf.n==0 
16ec0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
16ed0 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20   bFlush ){.     
16ee0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
16ef0 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20  >pgno!=0 );.    
16f00 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
16f10 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
16f20 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
16f30 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
16f40 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  i, pDlidx->pgno)
16f50 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69  ,.          pDli
16f60 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64  dx->buf.p, pDlid
16f70 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29  x->buf.n.      )
16f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16f90 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72  te3Fts5BufferZer
16fa0 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b  o(&pDlidx->buf);
16fb0 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72  .    pDlidx->bPr
16fc0 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  evValid = 0;.  }
16fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74  .}../*.** Grow t
16fe0 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  he pWriter->aDli
16ff0 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61 74  dx[] array to at
17000 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d   least nLvl elem
17010 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ents in size..**
17020 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20 65   Any new array e
17030 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72 6f  lements are zero
17040 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
17050 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
17060 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  nt fts5WriteDlid
17070 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e 64  xGrow(.  Fts5Ind
17080 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67  ex *p,.  Fts5Seg
17090 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
170a0 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20  .  int nLvl.){. 
170b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
170c0 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70  TE_OK && nLvl>=p
170d0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29  Writer->nDlidx )
170e0 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
170f0 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d 20  riter *aDlidx = 
17100 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
17110 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
17120 63 28 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  c(.        pWrit
17130 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65  er->aDlidx, size
17140 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  of(Fts5DlidxWrit
17150 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29  er) * nLvl.    )
17160 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64 78  ;.    if( aDlidx
17170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
17180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
17190 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
171a0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
171b0 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
171c0 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20  Writer) * (nLvl 
171d0 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  - pWriter->nDlid
171e0 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  x);.      memset
171f0 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72  (&aDlidx[pWriter
17200 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42  ->nDlidx], 0, nB
17210 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69  yte);.      pWri
17220 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44  ter->aDlidx = aD
17230 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69  lidx;.      pWri
17240 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c  ter->nDlidx = nL
17250 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  vl;.    }.  }.  
17260 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
17270 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  ./*.** If the cu
17280 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
17290 64 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  dex accumulating
172a0 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   in pWriter->aDl
172b0 69 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a  idx[] is large.*
172c0 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20  * enough, flush 
172d0 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72  it to disk and r
172e0 65 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69  eturn 1. Otherwi
172f0 73 65 20 64 69 73 63 61 72 64 20 69 74 20 61 6e  se discard it an
17300 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f  d return.** zero
17310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17320 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c  fts5WriteFlushDl
17330 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
17340 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
17350 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74  *pWriter){.  int
17360 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f   bFlag = 0;..  /
17370 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  * If there were 
17380 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
17390 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74  IZE or more empt
173a0 79 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69  y leaf pages wri
173b0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
173c0 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20   database, also 
173d0 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  write the doclis
173e0 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e  t-index to disk.
173f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
17400 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
17410 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72  f.n>0 && pWriter
17420 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d  ->nEmpty>=FTS5_M
17430 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b  IN_DLIDX_SIZE ){
17440 0a 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a  .    bFlag = 1;.
17450 20 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44    }.  fts5WriteD
17460 6c 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72  lidxClear(p, pWr
17470 69 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20  iter, bFlag);.  
17480 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
17490 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46  = 0;.  return bF
174a0 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  lag;.}../*.** Th
174b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
174c0 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70  alled whenever p
174d0 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
174e0 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
174f0 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f   .** last term o
17500 6e 20 6c 65 61 66 20 70 61 67 65 20 28 70 57 72  n leaf page (pWr
17510 69 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69  iter->iBtPage) i
17520 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a  s completed. .**
17530 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d  .** The doclist-
17540 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74  index for that t
17550 65 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  erm is currently
17560 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72   stored in-memor
17570 79 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  y within the.** 
17580 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 61 44  Fts5SegWriter.aD
17590 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66  lidx[] array. If
175a0 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
175b0 75 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ugh, this functi
175c0 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20  on.** writes it 
175d0 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c  out to disk. Or,
175e0 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d   if it is too sm
175f0 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69  all to bother wi
17600 74 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20  th, discards.** 
17610 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65  it..**.** Fts5Se
17620 67 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63  gWriter.btterm c
17630 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
17640 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
17650 20 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67 65   on page iBtPage
17660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17670 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
17680 74 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  tree(Fts5Index *
17690 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
176a0 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e   *pWriter){.  in
176b0 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65  t bFlag;..  asse
176c0 72 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74  rt( pWriter->iBt
176d0 50 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d  Page || pWriter-
176e0 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20  >nEmpty==0 );.  
176f0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74  if( pWriter->iBt
17700 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
17710 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35  ;.  bFlag = fts5
17720 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28  WriteFlushDlidx(
17730 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20  p, pWriter);..  
17740 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
17760 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72  t char *z = (pWr
17770 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30  iter->btterm.n>0
17780 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57  ?(const char*)pW
17790 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a  riter->btterm.p:
177a0 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  "");.    /* The 
177b0 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c  following was al
177c0 72 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74  ready done in ft
177d0 73 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a  s5WriteInit(): *
177e0 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  /.    /* sqlite3
177f0 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
17800 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69  xWriter, 1, pWri
17810 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f  ter->iSegid); */
17820 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
17830 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72  d_blob(p->pIdxWr
17840 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69  iter, 2, z, pWri
17850 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53  ter->btterm.n, S
17860 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
17870 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
17880 69 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69  int64(p->pIdxWri
17890 74 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20  ter, 3, bFlag + 
178a0 28 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69  ((i64)pWriter->i
178b0 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20  BtPage<<1));.   
178c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
178d0 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
178e0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
178f0 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57  3_reset(p->pIdxW
17900 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 70 57  riter);.  }.  pW
17910 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
17920 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
17930 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  s is called once
17940 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70   for each leaf p
17950 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66  age except the f
17960 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69  irst that contai
17970 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  ns.** at least o
17980 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e  ne term. Argumen
17990 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20  t (nTerm/pTerm) 
179a0 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  is the split-key
179b0 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a   - a term that.*
179c0 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
179d0 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74   all terms writt
179e0 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65  en to earlier le
179f0 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20  aves, and equal 
17a00 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72  to or.** smaller
17a10 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
17a20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20  term on the new 
17a30 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  leaf..**.** If a
17a40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
17a50 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
17a60 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
17a70 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  ex.rc. If an err
17a80 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  or.** has alread
17a90 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
17aa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17ab0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
17ac0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
17ad0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
17ae0 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73  BtreeTerm(.  Fts
17af0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b10 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
17b20 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
17b30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
17b40 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17b50 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
17b60 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
17b70 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f  u8 *pTerm      /
17b80 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  * First term on 
17b90 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  new page */.){. 
17ba0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
17bb0 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29  tree(p, pWriter)
17bc0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  ;.  fts5BufferSe
17bd0 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
17be0 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72  er->btterm, nTer
17bf0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72  m, pTerm);.  pWr
17c00 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20  iter->iBtPage = 
17c10 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
17c20 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pgno;.}../*.** T
17c30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17c40 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73  called when flus
17c50 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65  hing a leaf page
17c60 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
17c70 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c  o.** terms at al
17c80 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  l to disk..*/.st
17c90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
17ca0 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a  iteBtreeNoTerm(.
17cb0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
17ce0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
17cf0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17d00 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  iter          /*
17d10 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
17d20 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
17d30 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64  re were no rowid
17d40 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61  s on the leaf pa
17d50 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74 68  ge either and th
17d60 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a  e doclist-index.
17d70 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
17d80 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61   been started, a
17d90 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79  ppend an 0x00 by
17da0 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20  te to it.  */.  
17db0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
17dc0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26  rstRowidInPage &
17dd0 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
17de0 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a  x[0].buf.n>0 ){.
17df0 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
17e00 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
17e10 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
17e20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
17e30 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
17e40 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
17e50 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
17e60 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
17e70 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b  pDlidx->buf, 0);
17e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
17e90 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72  ment the "number
17ea0 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c   of sequential l
17eb0 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61 20  eaves without a 
17ec0 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a  term" counter. *
17ed0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  /.  pWriter->nEm
17ee0 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63  pty++;.}..static
17ef0 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45 78   i64 fts5DlidxEx
17f00 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
17f10 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
17f20 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
17f30 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20  .  int iOff;..  
17f40 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47  iOff = 1 + fts5G
17f50 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
17f60 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
17f70 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56  wid);.  fts5GetV
17f80 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
17f90 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
17fa0 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  wid);.  return i
17fb0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
17fc0 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
17fd0 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
17fe0 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
17ff0 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74  nt leaf page. It
18000 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   is the.** first
18010 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68   on the page. Th
18020 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
18030 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61  nds an appropria
18040 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  te entry to the 
18050 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69  current.** docli
18060 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  st-index..*/.sta
18070 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
18080 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20  teDlidxAppend(. 
18090 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
180a0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
180b0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34  *pWriter, .  i64
180c0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74   iRowid.){.  int
180d0 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20   i;.  int bDone 
180e0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
180f0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18100 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69  K && bDone==0; i
18110 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61  ++){.    i64 iVa
18120 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  l;.    Fts5Dlidx
18130 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
18140 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
18150 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  x[i];..    if( p
18160 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  Dlidx->buf.n>=p-
18170 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
18180 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
18190 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
181a0 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75 6c  ndex page is ful
181b0 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 64  l. Write it to d
181c0 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20  isk and push.   
181d0 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20     ** a copy of 
181e0 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77 69  iRowid (which wi
181f0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69  ll become the fi
18200 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  rst rowid on the
18210 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64   next.      ** d
18220 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61  oclist-index lea
18230 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20  f page) up into 
18240 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f  the next level o
18250 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20  f the b-tree .  
18260 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79      ** hierarchy
18270 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65  . If the node be
18280 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20 63  ing flushed is c
18290 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f  urrently the roo
182a0 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a  t node,.      **
182b0 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66   also push its f
182c0 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61 72  irst rowid upwar
182d0 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c  ds. */.      pDl
182e0 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20  idx->buf.p[0] = 
182f0 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  0x01;    /* Not 
18300 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  the root node */
18310 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
18320 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
18330 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
18340 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18350 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
18360 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
18370 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
18380 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
18390 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73      );.      fts
183a0 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
183b0 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29  p, pWriter, i+2)
183c0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d  ;.      pDlidx =
183d0 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
183e0 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x[i];.      if( 
183f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18400 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75   && pDlidx[1].bu
18410 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
18420 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 66    i64 iFirst = f
18430 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
18440 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64  irstRowid(&pDlid
18450 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20  x->buf);..      
18460 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68    /* This was th
18470 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73  e root node. Pus
18480 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
18490 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20  d up to the new 
184a0 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  root. */.       
184b0 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20   pDlidx[1].pgno 
184c0 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a  = pDlidx->pgno;.
184d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
184e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
184f0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18500 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29  Dlidx[1].buf, 0)
18510 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18520 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
18530 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
18540 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
18550 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20  pDlidx->pgno);. 
18560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
18570 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
18580 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
18590 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69  lidx[1].buf, iFi
185a0 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44  rst);.        pD
185b0 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c  lidx[1].bPrevVal
185c0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
185d0 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20  pDlidx[1].iPrev 
185e0 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  = iFirst;.      
185f0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
18600 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
18610 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
18620 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
18630 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  vValid = 0;.    
18640 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b    pDlidx->pgno++
18650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18660 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
18670 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c    }..    if( pDl
18680 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
18690 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
186a0 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d  iRowid - pDlidx-
186b0 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  >iPrev;.    }els
186c0 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 67  e{.      i64 iPg
186d0 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72  no = (i==0 ? pWr
186e0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
186f0 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
18700 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
18710 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
18720 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
18730 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18740 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18750 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
18760 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
18770 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
18780 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
18790 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
187a0 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
187b0 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
187c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
187d0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
187e0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
187f0 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
18800 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
18810 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
18820 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
18830 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
18840 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
18850 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
18860 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
18870 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
18880 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
18890 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
188a0 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
188b0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
188c0 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
188d0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
188e0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
188f0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20    i64 iRowid;.. 
18900 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 2d   assert( (pPage-
18910 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70  >pgidx.n==0)==(p
18920 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
18930 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20  rmInPage) );..  
18940 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
18950 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
18960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
18970 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67  fts5GetU16(&pPag
18980 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a  e->buf.p[2]) );.
18990 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50    fts5PutU16(&pP
189a0 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28  age->buf.p[2], (
189b0 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
189c0 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65  );..  if( pWrite
189d0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
189e0 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  age ){.    /* No
189f0 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65   term was writte
18a00 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20  n to this page. 
18a10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
18a20 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
18a30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74   );.    fts5Writ
18a40 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20  eBtreeNoTerm(p, 
18a50 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73  pWriter);.  }els
18a60 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  e{.    /* Append
18a70 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74 68   the pgidx to th
18a80 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20 53  e page buffer. S
18a90 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65  et the szLeaf he
18aa0 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  ader field. */. 
18ab0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
18ac0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
18ad0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61  &pPage->buf, pPa
18ae0 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61  ge->pgidx.n, pPa
18af0 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20  ge->pgidx.p);.  
18b00 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
18b10 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69  e page out to di
18b20 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  sk */.  iRowid =
18b30 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18b40 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18b50 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gid, pPage->pgno
18b60 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
18b70 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50  te(p, iRowid, pP
18b80 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
18b90 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a  e->buf.n);..  /*
18ba0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
18bb0 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  next page. */.  
18bc0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
18bd0 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66  pPage->buf);.  f
18be0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
18bf0 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20  Page->pgidx);.  
18c00 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
18c10 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
18c20 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
18c30 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72  o);.  pPage->iPr
18c40 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70  evPgidx = 0;.  p
18c50 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
18c60 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
18c70 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
18c80 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
18c90 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
18ca0 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en++;..  /* The 
18cb0 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e  new leaf holds n
18cc0 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64  o terms or rowid
18cd0 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  s */.  pWriter->
18ce0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18cf0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
18d00 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
18d10 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 1;.}../*.**
18d20 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
18d30 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
18d40 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
18d50 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
18d60 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
18d70 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
18d80 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
18d90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
18da0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
18db0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
18dc0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
18dd0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
18de0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
18df0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18e00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18e10 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
18e20 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
18e30 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
18e40 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
18e50 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
18e60 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
18e70 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
18ea0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
18eb0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
18ec0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
18ed0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
18ee0 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35  ->writer;.  Fts5
18ef0 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d  Buffer *pPgidx =
18f00 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
18f10 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73 65  r.pgidx;..  asse
18f20 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
18f30 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
18f40 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
18f50 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
18f60 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c  Page->buf.n>4 ||
18f70 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
18f80 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20  TermInPage );.. 
18f90 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
18fa0 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  nt leaf page is 
18fb0 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74  full, flush it t
18fc0 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28  o disk. */.  if(
18fd0 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
18fe0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65   pPgidx->n + nTe
18ff0 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e  rm + 2)>=p->pCon
19000 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
19010 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
19020 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
19030 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
19040 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
19050 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
19060 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70  rGrow(&p->rc, &p
19070 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
19080 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49  +FTS5_DATA_PADDI
19090 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  NG);.  }.  .  /*
190a0 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67   TODO1: Updating
190b0 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a   pgidx here. */.
190c0 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73    pPgidx->n += s
190d0 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
190e0 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67 69  int(.      &pPgi
190f0 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d  dx->p[pPgidx->n]
19100 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d  , pPage->buf.n -
19110 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
19120 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d  dx.  );.  pPage-
19130 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 70 50  >iPrevPgidx = pP
19140 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20  age->buf.n;.#if 
19150 30 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26  0.  fts5PutU16(&
19160 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
19170 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
19180 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e  .n);.  pPgidx->n
19190 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20   += 2;.#endif.. 
191a0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
191b0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
191c0 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
191d0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
191e0 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
191f0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
19200 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
19210 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e  a leaf that is n
19220 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20  ot the leftmost 
19230 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a  leaf in.      **
19240 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
19250 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
19260 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  e it is necessar
19270 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20  y to add a term 
19280 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
19290 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
192a0 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72   that is (a) lar
192b0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
192c0 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20  gest term .     
192d0 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74   ** already writ
192e0 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65  ten to the segme
192f0 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c  nt and (b) small
19300 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
19310 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69   to.      ** thi
19320 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72  s term. In other
19330 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78   words, a prefix
19340 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   of (pTerm/nTerm
19350 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20  ) that is one.  
19360 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67      ** byte long
19370 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67  er than the long
19380 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72  est prefix (pTer
19390 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20  m/nTerm) shares 
193a0 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a  with the.      *
193b0 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e  * previous term.
193c0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
193d0 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65   ** Usually, the
193e0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
193f0 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  s available in p
19400 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20  Page->term. The 
19410 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20  exception.      
19420 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73  ** is if this is
19430 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
19440 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e  written in an in
19450 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20  cremental-merge 
19460 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49  step..      ** I
19470 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
19480 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
19490 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
194a0 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a  so just write a.
194b0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
194c0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69   (pTerm/nTerm) i
194d0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e  nto the parent n
194e0 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69  ode. This is sli
194f0 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69  ghtly.      ** i
19500 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20  nefficient, but 
19510 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20  still correct.  
19520 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
19530 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66   nTerm;.      if
19540 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20  ( pPage->term.n 
19550 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31  ){.        n = 1
19560 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   + fts5PrefixCom
19570 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
19580 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
19590 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
195a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
195b0 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
195c0 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20  erm(p, pWriter, 
195d0 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  n, pTerm);.     
195e0 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
195f0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d  r->writer;.    }
19600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
19610 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66  refix = fts5Pref
19620 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
19630 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
19640 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20  >term.p, nTerm, 
19650 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35  pTerm);.    fts5
19660 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
19670 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
19680 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78 29  e->buf, nPrefix)
19690 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
196a0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
196b0 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   bytes of new da
196c0 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72  ta, then the ter
196d0 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20 20  m data itself.  
196e0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
196f0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  */.  fts5BufferA
19700 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
19710 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19720 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
19730 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
19740 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
19750 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
19760 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20  Term - nPrefix, 
19770 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29  &pTerm[nPrefix])
19780 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
19790 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74 65  he Fts5PageWrite
197a0 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f  r.term field. */
197b0 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
197c0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
197d0 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  >term, nTerm, pT
197e0 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
197f0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
19800 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74 65  e = 0;..  pWrite
19810 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19820 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69  Page = 0;.  pWri
19830 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
19840 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a  InDoclist = 1;..
19850 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
19860 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c  || (pWriter->nDl
19870 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72  idx>0 && pWriter
19880 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
19890 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69 74  n==0) );.  pWrit
198a0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67  er->aDlidx[0].pg
198b0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
198c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
198d0 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70 6f  d a rowid and po
198e0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
198f0 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72   field to the wr
19900 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
19910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
19920 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
19930 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
19940 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
19950 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
19960 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20 20 69   i64 iRowid,.  i
19970 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69 66 28  nt nPos.){.  if(
19980 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19990 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
199a0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
199b0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
199c0 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61  r;..    if( (pPa
199d0 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
199e0 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e  e->pgidx.n)>=p->
199f0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
19a00 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
19a10 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
19a20 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iter);.    }..  
19a30 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19a40 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
19a50 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f  rowid written to
19a60 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
19a70 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  he .    ** rowid
19a80 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
19a90 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
19aa0 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
19ab0 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
19ac0 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
19ad0 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
19ae0 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
19af0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
19b00 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
19b10 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
19b20 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
19b30 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29  ge->buf.p, (u16)
19b40 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
19b50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
19b60 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72  idxAppend(p, pWr
19b70 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
19b80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
19b90 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f  te the rowid. */
19ba0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
19bb0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
19bc0 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65  oclist || pWrite
19bd0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19be0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
19bf0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
19c00 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
19c10 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
19c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19c30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
19c40 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69  c || iRowid>pWri
19c50 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
19c60 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
19c70 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19c80 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
19c90 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57  buf, iRowid - pW
19ca0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
19cb0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
19cc0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
19cd0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
19ce0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19cf0 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
19d00 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  0;.    pWriter->
19d10 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
19d20 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74 73 35  e = 0;..    fts5
19d30 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
19d40 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
19d50 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20  e->buf, nPos);. 
19d60 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
19d70 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
19d80 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20  dPoslistData(.  
19d90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
19da0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
19db0 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73  pWriter, .  cons
19dc0 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20  t u8 *aData, .  
19dd0 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46  int nData.){.  F
19de0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
19df0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
19e00 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74  >writer;.  const
19e10 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
19e20 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
19e30 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
19e40 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
19e50 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
19e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
19e70 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62      && (pPage->b
19e80 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
19e90 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70  idx.n + n)>=p->p
19ea0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20  Config->pgsz .  
19eb0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20  ){.    int nReq 
19ec0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
19ed0 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e  sz - pPage->buf.
19ee0 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n - pPage->pgidx
19ef0 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70  .n;.    int nCop
19f00 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  y = 0;.    while
19f10 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a  ( nCopy<nReq ){.
19f20 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b        i64 dummy;
19f30 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20  .      nCopy += 
19f40 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
19f50 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26  [nCopy], (u64*)&
19f60 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
19f70 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19f80 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19f90 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70  pPage->buf, nCop
19fa0 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20  y, a);.    a += 
19fb0 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20  nCopy;.    n -= 
19fc0 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57  nCopy;.    fts5W
19fd0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
19fe0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
19ff0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1a000 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1a010 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1a020 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b  age->buf, n, a);
1a030 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  .  }.}../*.** Fl
1a040 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61 63  ush any data cac
1a050 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74 65  hed by the write
1a060 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
1a070 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20 61  database. Free a
1a080 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ny.** allocation
1a090 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a0a0 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f  h the writer..*/
1a0b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a0c0 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20  5WriteFinish(.  
1a0d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1a0e0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1a0f0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1a100 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1a110 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65  t */.  int *pnLe
1a120 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1a130 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1a140 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
1a150 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f  ges in b-tree */
1a160 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  .){.  int i;.  F
1a170 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1a180 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
1a190 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70  >writer;.  if( p
1a1a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a1b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a1c0 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b  Leaf->pgno>=1 );
1a1d0 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
1a1e0 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
1a1f0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1a200 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1a210 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65  .    }.    *pnLe
1a220 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f  af = pLeaf->pgno
1a230 2d 31 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  -1;.    fts5Writ
1a240 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1a250 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66  Writer);.  }.  f
1a260 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1a270 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66  Leaf->term);.  f
1a280 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1a290 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74  Leaf->buf);.  ft
1a2a0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1a2b0 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66  eaf->pgidx);.  f
1a2c0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1a2d0 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b  Writer->btterm);
1a2e0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
1a2f0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20  Writer->nDlidx; 
1a300 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1a310 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
1a320 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1a330 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  [i].buf);.  }.  
1a340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
1a350 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d  iter->aDlidx);.}
1a360 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1a370 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46  s5WriteInit(.  F
1a380 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1a390 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1a3a0 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69  Writer, .  int i
1a3b0 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74  Segid.){.  const
1a3c0 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70   int nBuffer = p
1a3d0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1a3e0 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
1a3f0 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  ING;..  memset(p
1a400 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
1a410 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
1a420 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  );.  pWriter->iS
1a430 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
1a440 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1a450 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c  Grow(p, pWriter,
1a460 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e   1);.  pWriter->
1a470 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b  writer.pgno = 1;
1a480 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1a490 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31  stTermInPage = 1
1a4a0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
1a4b0 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  Page = 1;..  ass
1a4c0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72  ert( pWriter->wr
1a4d0 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b  iter.buf.n==0 );
1a4e0 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1a4f0 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1a500 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47  .n==0 );..  /* G
1a510 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66  row the two buff
1a520 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61  ers to pgsz + pa
1a530 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73  dding bytes in s
1a540 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ize. */.  sqlite
1a550 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
1a560 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72  &p->rc, &pWriter
1a570 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c 20  ->writer.pgidx, 
1a580 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c 69  nBuffer);.  sqli
1a590 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1a5a0 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1a5b0 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20  er->writer.buf, 
1a5c0 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28  nBuffer);..  if(
1a5d0 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d   p->pIdxWriter==
1a5e0 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
1a5f0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1a600 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
1a610 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
1a620 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57  tmt(p, &p->pIdxW
1a630 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  riter, sqlite3_m
1a640 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1a650 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27    "INSERT INTO '
1a660 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67  %q'.'%q_idx'(seg
1a670 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41  id,term,pgno) VA
1a680 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20  LUES(?,?,?)", . 
1a690 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
1a6a0 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
1a6b0 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
1a6c0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
1a6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a6e0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1a6f0 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70  he 4-byte leaf-p
1a700 61 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78  age header to 0x
1a710 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  00. */.    memse
1a720 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  t(pWriter->write
1a730 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a  r.buf.p, 0, 4);.
1a740 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69      pWriter->wri
1a750 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a  ter.buf.n = 4;..
1a760 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20      /* Bind the 
1a770 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73  current output s
1a780 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65  egment id to the
1a790 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54   index-writer. T
1a7a0 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  his is an.    **
1a7b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76   optimization ov
1a7c0 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73  er binding the s
1a7d0 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61  ame value over a
1a7e0 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20  nd over as rows 
1a7f0 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  are.    ** inser
1a800 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62  ted into %_idx b
1a810 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72  y the current wr
1a820 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71  iter.  */.    sq
1a830 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1a840 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1a850 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1a860 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a870 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77  Iterator pIter w
1a880 61 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  as used to itera
1a890 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
1a8a0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66  nput segments of
1a8b0 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d   on an.** increm
1a8c0 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72  ental merge oper
1a8d0 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ation. This func
1a8e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69  tion is called i
1a8f0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1a900 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20  l.** merge step 
1a910 68 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74  has finished but
1a920 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e   the input has n
1a930 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  ot been complete
1a940 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f  ly exhausted..*/
1a950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a960 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74  5TrimSegments(Ft
1a970 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1a980 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1a990 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
1a9a0 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
1a9b0 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
1a9c0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1a9d0 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r));.  for(i=0; 
1a9e0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
1a9f0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  ++){.    Fts5Seg
1aa00 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
1aa10 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
1aa20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67    if( pSeg->pSeg
1aa30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1aa40 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
1aa50 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65  se if( pSeg->pLe
1aa60 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  af==0 ){.      /
1aa70 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20  * All keys from 
1aa80 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65  this input segme
1aa90 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61  nt have been tra
1aaa0 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f  nsfered to the o
1aab0 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20  utput..      ** 
1aac0 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72  Set both the fir
1aad0 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65  st and last page
1aae0 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f  -numbers to 0 to
1aaf0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1ab00 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  he.      ** segm
1ab10 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79  ent is now empty
1ab20 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d  . */.      pSeg-
1ab30 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
1ab40 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  = 0;.      pSeg-
1ab50 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1ab60 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1ab70 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20  .      int iOff 
1ab80 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  = pSeg->iTermLea
1ab90 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20  fOffset;     /* 
1aba0 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69  Offset on new fi
1abb0 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  rst leaf page */
1abc0 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66  .      i64 iLeaf
1abd0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73  Rowid;.      Fts
1abe0 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20  5Data *pData;.  
1abf0 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
1ac00 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
1ac10 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b  ;.      u8 aHdr[
1ac20 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30  4] = {0x00, 0x00
1ac30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a  , 0x00, 0x00};..
1ac40 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64        iLeafRowid
1ac50 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1ac60 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d  ROWID(iId, pSeg-
1ac70 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
1ac80 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66  .      pData = f
1ac90 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
1aca0 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
1acb0 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
1acc0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1acd0 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20  rZero(&buf);.   
1ace0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47       fts5BufferG
1acf0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  row(&p->rc, &buf
1ad00 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20  , pData->nn);.  
1ad10 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ad20 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1ad30 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1ad40 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1ad50 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ad60 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1ad70 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1ad80 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
1ad90 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ada0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1adb0 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1adc0 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29  n, pSeg->term.p)
1add0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1ade0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1adf0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1ae00 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c  ta->szLeaf-iOff,
1ae10 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d   &pData->p[iOff]
1ae20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ae30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ae40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ae50 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66  Set the szLeaf f
1ae60 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ield */.        
1ae70 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75    fts5PutU16(&bu
1ae80 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66  f.p[2], (u16)buf
1ae90 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  .n);.        }..
1aea0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75          /* Set u
1aeb0 70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69  p the new page-i
1aec0 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20  ndex array */.  
1aed0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1aee0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1aef0 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20  >rc, &buf, 4);. 
1af00 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
1af10 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67  >iLeafPgno==pSeg
1af20 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
1af30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65  .         && pSe
1af40 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  g->iEndofDoclist
1af50 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a  <pData->szLeaf .
1af60 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1af70 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d       int nDiff =
1af80 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
1af90 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63   pSeg->iEndofDoc
1afa0 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  list;.          
1afb0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1afc0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1afd0 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d  buf, buf.n - 1 -
1afe0 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20   nDiff - 4);.   
1aff0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1b000 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1b010 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20  rc, &buf, .     
1b020 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e           pData->
1b030 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64  nn - pSeg->iPgid
1b040 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  xOff, &pData->p[
1b050 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d  pSeg->iPgidxOff]
1b060 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1b070 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1b080 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1b090 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  (pData);.       
1b0a0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1b0b0 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69  oFirst = pSeg->i
1b0c0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  TermLeafPgno;.  
1b0d0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
1b0e0 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
1b0f0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20  MENT_ROWID(iId, 
1b100 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b  1), iLeafRowid);
1b110 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1b120 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52  aWrite(p, iLeafR
1b130 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66  owid, buf.p, buf
1b140 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
1b150 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66   }.  }.  fts5Buf
1b160 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
1b170 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1b180 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
1b190 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
1b1a0 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70  x *p, .  void *p
1b1b0 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  Ctx, .  const u8
1b1c0 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
1b1d0 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65  hunk.){.  Fts5Se
1b1e0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1b1f0 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65   = (Fts5SegWrite
1b200 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57  r*)pCtx;.  fts5W
1b210 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
1b220 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72  tData(p, pWriter
1b230 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
1b240 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
1b250 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1b260 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a  ndexMergeLevel(.
1b270 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b290 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1b2a0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1b2b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1b2c0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1b2d0 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72   IN/OUT: Stuctur
1b2e0 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
1b2f0 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b310 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64  /* Level to read
1b320 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20   input from */. 
1b330 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20   int *pnRem     
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20   /* Write up to 
1b360 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74  this many output
1b370 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20   leaves */.){.  
1b380 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1b390 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1b3a0 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ct;.  Fts5Struct
1b3b0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
1b3c0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1b3d0 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53  l[iLvl];.  Fts5S
1b3e0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
1b3f0 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 6e  LvlOut;.  Fts5In
1b400 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
1b410 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65   0;       /* Ite
1b420 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e  rator to read in
1b430 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  put data */.  in
1b440 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f  t nRem = pnRem ?
1b450 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a   *pnRem : 0;  /*
1b460 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67   Output leaf pag
1b470 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
1b480 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74   */.  int nInput
1b490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b4a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b4b0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
1b4c0 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  s */.  Fts5SegWr
1b4d0 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
1b4e0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1b4f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1b500 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1b510 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
1b520 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  Output segment *
1b530 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
1b540 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65  erm;.  int bOlde
1b550 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1b560 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b570 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
1b580 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65  ment is the olde
1b590 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
1b5a0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1b5b0 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Level );.  asser
1b5c0 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c  t( pLvl->nMerge<
1b5d0 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a  =pLvl->nSeg );..
1b5e0 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
1b5f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1b600 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d  SegWriter));.  m
1b610 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
1b620 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1b630 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d  r));.  if( pLvl-
1b640 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70  >nMerge ){.    p
1b650 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
1b660 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
1b670 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1b680 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29  LvlOut->nSeg>0 )
1b690 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70  ;.    nInput = p
1b6a0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1b6b0 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
1b6c0 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
1b6d0 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74  nSeg-1];..    ft
1b6e0 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
1b6f0 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53  writer, pSeg->iS
1b700 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65  egid);.    write
1b710 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  r.writer.pgno = 
1b720 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31  pSeg->pgnoLast+1
1b730 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42 74  ;.    writer.iBt
1b740 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Page = 0;.  }els
1b750 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
1b760 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
1b770 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
1b780 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  );..    /* Exten
1b790 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  d the Fts5Struct
1b7a0 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65  ure object as re
1b7b0 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65  quired to ensure
1b7c0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1b7d0 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74  ** segment exist
1b7e0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c  s. */.    if( iL
1b7f0 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vl==pStruct->nLe
1b800 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  vel-1 ){.      f
1b810 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
1b820 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53  evel(&p->rc, ppS
1b830 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
1b840 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1b850 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
1b860 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
1b870 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53  Level(&p->rc, pS
1b880 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31  truct, iLvl+1, 1
1b890 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
1b8a0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
1b8b0 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
1b8c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1b8d0 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
1b8e0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b8f0 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74  iLvl+1];..    ft
1b900 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
1b910 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b  writer, iSegid);
1b920 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
1b930 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20   new segment to 
1b940 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c  the output level
1b950 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26   */.    pSeg = &
1b960 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
1b970 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
1b980 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
1b990 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
1b9a0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1b9b0 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
1b9c0 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75  Segid;.    pStru
1b9d0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a  ct->nSegment++;.
1b9e0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70  .    /* Read inp
1b9f0 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d  ut from all segm
1ba00 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
1ba10 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e  t level */.    n
1ba20 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  Input = pLvl->nS
1ba30 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73  eg;.  }.  bOldes
1ba40 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53  t = (pLvlOut->nS
1ba50 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74  eg==1 && pStruct
1ba60 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32  ->nLevel==iLvl+2
1ba70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  );..  assert( iL
1ba80 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66  vl>=0 );.  for(f
1ba90 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
1baa0 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30  p, pStruct, 0, 0
1bab0 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49  , 0, 0, iLvl, nI
1bac0 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20  nput, &pIter);. 
1bad0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1bae0 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
1baf0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
1bb00 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1bb10 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
1bb20 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
1bb30 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49   *pSegIter = &pI
1bb40 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1bb50 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1bb60 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50  st ];.    int nP
1bb70 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
1bb80 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74          /* posit
1bb90 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
1bba0 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  eld value */.   
1bbb0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
1bbc0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b  const u8 *pTerm;
1bbd0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
1bbe0 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74  or key annihilat
1bbf0 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
1bc00 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d  pSegIter->nPos==
1bc10 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c  0 && (bOldest ||
1bc20 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d   pSegIter->bDel=
1bc30 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
1bc40 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73  .    pTerm = fts
1bc50 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
1bc60 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20  Iter, &nTerm);. 
1bc70 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65     if( nTerm!=te
1bc80 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  rm.n || memcmp(p
1bc90 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54  Term, term.p, nT
1bca0 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  erm) ){.      if
1bcb0 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
1bcc0 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
1bcd0 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62  Rem ){.        b
1bce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1bcf0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
1bd00 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
1bd10 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
1bd20 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
1bd30 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72   */.      fts5Wr
1bd40 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
1bd50 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c   &writer, nTerm,
1bd60 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66   pTerm);.      f
1bd70 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1bd80 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72  >rc, &term, nTer
1bd90 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d  m, pTerm);.    }
1bda0 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
1bdb0 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65  the rowid to the
1bdc0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f   output */.    /
1bdd0 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
1bde0 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d  ZE */.    nPos =
1bdf0 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a   pSegIter->nPos*
1be00 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44  2 + pSegIter->bD
1be10 65 6c 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  el;.    fts5Writ
1be20 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20  eAppendRowid(p, 
1be30 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c  &writer, fts5Mul
1be40 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
1be50 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20  r), nPos);..    
1be60 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f  /* Append the po
1be70 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61  sition-list data
1be80 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a   to the output *
1be90 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49  /.    fts5ChunkI
1bea0 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74  terate(p, pSegIt
1beb0 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74  er, (void*)&writ
1bec0 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75  er, fts5MergeChu
1bed0 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d  nkCallback);.  }
1bee0 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
1bef0 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
1bf00 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65  to disk. Set the
1bf10 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
1bf20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20  b-tree height.  
1bf30 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66  ** and last leaf
1bf40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20   page number at 
1bf50 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
1bf60 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69  */.  fts5WriteFi
1bf70 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
1bf80 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74   &pSeg->pgnoLast
1bf90 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75  );..  if( fts5Mu
1bfa0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1bfb0 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ter) ){.    int 
1bfc0 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  i;..    /* Remov
1bfd0 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
1bfe0 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
1bff0 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  e %_data table *
1c000 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1c010 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
1c020 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d       fts5DataRem
1c030 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c  oveSegment(p, pL
1c040 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67  vl->aSeg[i].iSeg
1c050 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
1c060 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
1c070 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
1c080 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
1c090 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
1c0a0 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e   pLvl->nSeg!=nIn
1c0b0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  put ){.      int
1c0c0 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e   nMove = (pLvl->
1c0d0 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a  nSeg - nInput) *
1c0e0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1c0f0 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
1c100 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76       memmove(pLv
1c110 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  l->aSeg, &pLvl->
1c120 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d  aSeg[nInput], nM
1c130 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ove);.    }.    
1c140 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1c150 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  t -= nInput;.   
1c160 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
1c170 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
1c180 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
1c190 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
1c1a0 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
1c1b0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
1c1c0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
1c1d0 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  nSegment--;.    
1c1e0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
1c1f0 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e  ssert( pSeg->pgn
1c200 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66  oLast>0 );.    f
1c210 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1c220 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
1c230 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49  Lvl->nMerge = nI
1c240 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  nput;.  }..  fts
1c250 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
1c260 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
1c270 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
1c280 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29  );.  if( pnRem )
1c290 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65   *pnRem -= write
1c2a0 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a  r.nLeafWritten;.
1c2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74  }../*.** Do up t
1c2c0 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20 61  o nPg pages of a
1c2d0 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e  utomerge work on
1c2e0 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73   the index..*/.s
1c2f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1c300 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74 73  ndexMerge(.  Fts
1c310 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c330 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1c340 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1c350 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1c360 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1c370 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1c380 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1c390 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20 20 20  /.  int nPg     
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66 20      /* Pages of 
1c3c0 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b  work to do */.){
1c3d0 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50  .  int nRem = nP
1c3e0 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  g;.  Fts5Structu
1c3f0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1c400 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65  pStruct;.  while
1c410 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72  ( nRem>0 && p->r
1c420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c430 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c450 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  /* To iterate th
1c460 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
1c470 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c      int iBestLvl
1c480 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c490 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e  /* Level offerin
1c4a0 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74  g the most input
1c4b0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
1c4c0 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20   int nBest = 0; 
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4e0 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
1c4f0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74  segments on best
1c500 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f   level */..    /
1c510 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74  * Set iBestLvl t
1c520 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72  o the level to r
1c530 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ead input segmen
1c540 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ts from. */.    
1c550 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
1c560 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20  >nLevel>0 );.   
1c570 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1c580 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1c590 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1c5a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1c5b0 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
1c5c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1c5d0 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  vl];.      if( p
1c5e0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
1c5f0 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
1c600 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b  >nMerge>nBest ){
1c610 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74  .          iBest
1c620 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
1c630 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
1c640 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
1c650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
1c660 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c670 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65     if( pLvl->nSe
1c680 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  g>nBest ){.     
1c690 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
1c6a0 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69  >nSeg;.        i
1c6b0 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
1c6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c6d0 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69     /* If nBest i
1c6e0 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20  s still 0, then 
1c6f0 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
1c700 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64  e empty. */.#ifd
1c710 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c720 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1c730 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c  nBest==0 && iLvl
1c740 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1c750 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1c760 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1c770 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1c780 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Seg==0 );.    }.
1c790 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
1c7a0 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67  nBest<p->pConfig
1c7b0 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20 20  ->nAutomerge .  
1c7c0 20 20 20 20 20 20 26 26 20 70 53 74 72 75 63 74        && pStruct
1c7d0 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
1c7e0 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20  l].nMerge==0 .  
1c7f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
1c800 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ak;.    }.    ft
1c810 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1c820 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69  l(p, &pStruct, i
1c830 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  BestLvl, &nRem);
1c840 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1c850 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
1c860 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
1c870 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
1c880 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
1c890 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
1c8a0 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53  , iBestLvl+1, pS
1c8b0 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
1c8c0 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20  }.  *ppStruct = 
1c8d0 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  pStruct;.}../*.*
1c8e0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65  * A total of nLe
1c8f0 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  af leaf pages of
1c900 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20 62   data has just b
1c910 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61  een flushed to a
1c920 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d   level-0.** segm
1c930 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
1c940 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 77  on updates the w
1c950 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63  rite-counter acc
1c960 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66  ordingly and, if
1c970 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20 70  .** necessary, p
1c980 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e  erforms incremen
1c990 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a  tal merge work..
1c9a0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1c9b0 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
1c9c0 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
1c9d0 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
1c9e0 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
1c9f0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1ca00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ca10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1ca20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1ca30 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20 20  dexAutomerge(.  
1ca40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1ca70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1ca80 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
1ca90 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
1caa0 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
1cab0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
1cac0 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  x */.  int nLeaf
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1caf0 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65   of output leave
1cb00 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  s just written *
1cb10 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
1cb20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1cb30 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f  ->pConfig->nAuto
1cb40 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20 46  merge>0 ){.    F
1cb50 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1cb60 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1cb70 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69 74  t;.    u64 nWrit
1cb80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1cb90 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
1cba0 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63  value of write-c
1cbb0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
1cbc0 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20  t nWork;        
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cbe0 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75  umber of work-qu
1cbf0 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20  anta to perform 
1cc00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b  */.    int nRem;
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1cc30 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  f leaf pages lef
1cc40 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20  t to write */.. 
1cc50 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1cc60 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20   write-counter. 
1cc70 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20  While doing so, 
1cc80 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20  set nWork. */.  
1cc90 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75    nWrite = pStru
1cca0 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1ccb0 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28  r;.    nWork = (
1ccc0 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b 20  int)(((nWrite + 
1ccd0 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72  nLeaf) / p->nWor
1cce0 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65  kUnit) - (nWrite
1ccf0 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
1cd00 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  );.    pStruct->
1cd10 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d  nWriteCounter +=
1cd20 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d   nLeaf;.    nRem
1cd30 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72   = (int)(p->nWor
1cd40 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20  kUnit * nWork * 
1cd50 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
1cd60 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ;..    fts5Index
1cd70 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75 63  Merge(p, ppStruc
1cd80 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a  t, nRem);.  }.}.
1cd90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1cda0 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67  5IndexCrisismerg
1cdb0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1cdc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1cdd0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1cde0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1cdf0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1ce00 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20 20  *ppStruct       
1ce10 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
1ce20 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
1ce30 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63   index */.){.  c
1ce40 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69 73  onst int nCrisis
1ce50 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
1ce60 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20 46  CrisisMerge;.  F
1ce70 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1ce80 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1ce90 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20  t;.  int iLvl = 
1cea0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
1ceb0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
1cec0 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  | pStruct->nLeve
1ced0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
1cee0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cef0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
1cf00 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d  vel[iLvl].nSeg>=
1cf10 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20 66  nCrisis ){.    f
1cf20 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1cf30 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
1cf40 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73  iLvl, 0);.    as
1cf50 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
1cf60 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63  ITE_OK || pStruc
1cf70 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b  t->nLevel>(iLvl+
1cf80 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35 53 74  1) );.    fts5St
1cf90 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
1cfa0 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  , iLvl+1, pStruc
1cfb0 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a  t);.    iLvl++;.
1cfc0 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
1cfd0 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74  = pStruct;.}..st
1cfe0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
1cff0 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64  exReturn(Fts5Ind
1d000 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ex *p){.  int rc
1d010 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72   = p->rc;.  p->r
1d020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d030 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74   return rc;.}..t
1d040 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
1d050 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35 46  s5FlushCtx Fts5F
1d060 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20  lushCtx;.struct 
1d070 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20  Fts5FlushCtx {. 
1d080 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78   Fts5Index *pIdx
1d090 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ;.  Fts5SegWrite
1d0a0 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f  r writer; .};../
1d0b0 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75 66  *.** Buffer aBuf
1d0c0 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69  [] contains a li
1d0d0 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 61  st of varints, a
1d0e0 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  ll small enough 
1d0f0 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33  to fit.** in a 3
1d100 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 52  2-bit integer. R
1d110 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1d120 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72  f the largest pr
1d130 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a  efix of this .**
1d140 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65 73   list nMax bytes
1d150 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a 65   or less in size
1d160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d170 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
1d180 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66  x(const u8 *aBuf
1d190 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69  , int nMax){.  i
1d1a0 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64 75  nt ret;.  u32 du
1d1b0 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74 73  mmy;.  ret = fts
1d1c0 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42 75  5GetVarint32(aBu
1d1d0 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28  f, dummy);.  if(
1d1e0 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20   ret<nMax ){.   
1d1f0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1d200 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47     int i = fts5G
1d210 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75 66  etVarint32(&aBuf
1d220 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20  [ret], dummy);. 
1d230 20 20 20 20 20 69 66 28 20 28 72 65 74 20 2b 20       if( (ret + 
1d240 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61  i) > nMax ) brea
1d250 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b 3d 20  k;.      ret += 
1d260 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
1d270 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
1d280 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1d290 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d  ntents of in-mem
1d2a0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69  ory hash table i
1d2b0 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65  Hash to a new le
1d2c0 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e  vel-0 .** segmen
1d2d0 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20  t on disk. Also 
1d2e0 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65  update the corre
1d2f0 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75  sponding structu
1d300 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  re record..**.**
1d310 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d320 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1d330 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1d340 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1d350 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1d360 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1d370 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1d380 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1d390 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e  void fts5FlushOn
1d3a0 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20  eHash(Fts5Index 
1d3b0 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20  *p){.  Fts5Hash 
1d3c0 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73  *pHash = p->pHas
1d3d0 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  h;.  Fts5Structu
1d3e0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69  re *pStruct;.  i
1d3f0 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  nt iSegid;.  int
1d400 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20   pgnoLast = 0;  
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d420 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
1d430 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
1d440 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  nt */..  /* Obta
1d450 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
1d460 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  o the index stru
1d470 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61  cture and alloca
1d480 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74  te a new segment
1d490 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  -id.  ** for the
1d4a0 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67   new level-0 seg
1d4b0 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72  ment.  */.  pStr
1d4c0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1d4d0 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53  ureRead(p);.  iS
1d4e0 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
1d4f0 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
1d500 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  uct);..  if( iSe
1d510 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
1d520 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
1d530 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20  Config->pgsz;.. 
1d540 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1d550 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
1d560 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
1d570 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
1d580 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1d590 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
1d5a0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1d5b0 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1d5c0 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  le leaf page */.
1d5d0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a      Fts5Buffer *
1d5e0 70 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20  pPgidx;         
1d5f0 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77    /* Buffer in w
1d600 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65  hich to assemble
1d610 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46   pgidx */..    F
1d620 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1d630 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69  ter;.    fts5Wri
1d640 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1d650 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
1d660 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
1d670 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20  writer.buf;.    
1d680 70 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72  pPgidx = &writer
1d690 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a  .writer.pgidx;..
1d6a0 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65      /* fts5Write
1d6b0 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61  Init() should ha
1d6c0 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ve initialized t
1d6d0 68 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d  he buffers to (m
1d6e0 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20  ost likely).    
1d6f0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  ** the maximum s
1d700 70 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a  pace required. *
1d710 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
1d720 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70  >rc || pBuf->nSp
1d730 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
1d740 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
1d750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d760 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e  ->rc || pPgidx->
1d770 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20  nSpace>=(pgsz + 
1d780 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
1d790 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  G) );..    /* Be
1d7a0 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  gin scanning thr
1d7b0 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20  ough hash table 
1d7c0 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f  entries. This lo
1d7d0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1d7e0 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72   each.    ** ter
1d7f0 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e  m/doclist curren
1d800 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69  tly stored withi
1d810 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
1d820 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1d830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d840 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1d850 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1d860 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c  anInit(pHash, 0,
1d870 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   0);.    }.    w
1d880 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1d890 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
1d8a0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1d8b0 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20  Eof(pHash) ){.  
1d8c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d8d0 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
1d8e0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1d8f0 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ning term */.   
1d900 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f     const u8 *pDo
1d910 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  clist;         /
1d920 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  * Pointer to doc
1d930 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
1d940 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rm */.      int 
1d950 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
1d960 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d970 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79  of doclist in by
1d980 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  tes */..      /*
1d990 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
1d9a0 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74  for this entry t
1d9b0 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20  o disk. */.     
1d9c0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1d9d0 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c  ScanEntry(pHash,
1d9e0 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69   &zTerm, &pDocli
1d9f0 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a  st, &nDoclist);.
1da00 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
1da10 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
1da20 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65  iter, (int)strle
1da30 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74  n(zTerm), (const
1da40 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20   u8*)zTerm);..  
1da50 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74      assert( writ
1da60 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
1da70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1da80 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
1da90 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  ->n + pPgidx->n 
1daa0 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20  + nDoclist + 1) 
1dab0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1dac0 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1dad0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1dae0 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
1daf0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
1db00 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1db10 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73  ob(pBuf, pDoclis
1db20 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
1db30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1db40 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1db50 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
1db60 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  Delta = 0;.     
1db70 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
1db80 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
1db90 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
1dba0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
1dbb0 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66  this leaf. The f
1dbc0 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20  ollowing .      
1dbd0 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74    ** loop iterat
1dbe0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  es through the p
1dbf0 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b  oslists that mak
1dc00 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74  e up the current
1dc10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63   .        ** doc
1dc20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  list.  */.      
1dc30 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1dc40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
1dc50 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  f<nDoclist ){.  
1dc60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
1dc70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
1dc80 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  nCopy;.         
1dc90 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
1dca0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
1dcb0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
1dcc0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75  oclist[iOff], (u
1dcd0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
1dce0 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20          nCopy = 
1dcf0 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
1dd00 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  ze(&pDoclist[iOf
1dd10 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
1dd20 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  my);.          n
1dd30 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  Copy += nPos;.  
1dd40 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b          iRowid +
1dd50 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
1dd60 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
1dd70 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1dd80 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1dd90 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
1dda0 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30  utU16(&pBuf->p[0
1ddb0 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29  ], (u16)pBuf->n)
1ddc0 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77  ;   /* first row
1ddd0 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  id on page */.  
1dde0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
1ddf0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1de00 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1de10 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f  >p[pBuf->n], iRo
1de20 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1de30 20 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52    writer.bFirstR
1de40 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1de50 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1de60 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
1de70 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f  (p, &writer, iRo
1de80 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1de90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1dea0 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
1deb0 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1dec0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1ded0 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ->n], iDelta);. 
1dee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1def0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
1df00 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
1df10 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ce );..         
1df20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
1df30 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70  pPgidx->n + nCop
1df40 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20  y) <= pgsz ){.  
1df50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1df60 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
1df70 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
1df80 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f  current leaf. So
1df90 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20   copy.          
1dfa0 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67    ** it in one g
1dfb0 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  o. */.          
1dfc0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1dfd0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1dfe0 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
1dff0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1e000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e010 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
1e020 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
1e030 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69  l not fit on thi
1e040 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65  s leaf. So it ne
1e050 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  eds.            
1e060 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20  ** to be broken 
1e070 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54  into sections. T
1e080 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63  he only qualific
1e090 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20  ation being.    
1e0a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1e0b0 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74  each varint must
1e0c0 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69   be stored conti
1e0d0 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20  guously.  */.   
1e0e0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75           const u
1e0f0 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70  8 *pPoslist = &p
1e100 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20  Doclist[iOff];. 
1e110 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1e120 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
1e130 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
1e140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1e160 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20  t nSpace = pgsz 
1e170 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69  - pBuf->n - pPgi
1e180 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20  dx->n;.         
1e190 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1e1b0 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29  ( (nCopy - iPos)
1e1c0 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20  <=nSpace ){.    
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1e1e0 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20  nCopy - iPos;.  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1e200 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1e210 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69     n = fts5Posli
1e220 73 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69  stPrefix(&pPosli
1e230 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65  st[iPos], nSpace
1e240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1e250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1e260 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
1e280 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1e290 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50  ndBlob(pBuf, &pP
1e2a0 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29  oslist[iPos], n)
1e2b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e2c0 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  iPos += n;.     
1e2d0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
1e2e0 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
1e2f0 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20  n)>=pgsz ){.    
1e300 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1e310 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1e320 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
1e330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
1e350 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
1e360 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1e370 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e380 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
1e390 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Copy;.        }.
1e3a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e3b0 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74  * TODO2: Doclist
1e3c0 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74   terminator writ
1e3d0 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ten here. */.   
1e3e0 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42     /* pBuf->p[pB
1e3f0 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b  uf->n++] = '\0';
1e400 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1e410 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
1e420 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
1e430 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1e440 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b  ScanNext(pHash);
1e450 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1e460 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
1e470 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35  pHash);.    fts5
1e480 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
1e490 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73  writer, &pgnoLas
1e4a0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
1e4b0 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
1e4c0 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
1e4d0 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1e4e0 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
1e4f0 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
1e500 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
1e510 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
1e520 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
1e530 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
1e540 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
1e550 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
1e560 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
1e570 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1e580 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1e590 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
1e5a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
1e5b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e5c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
1e5d0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1e5e0 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
1e5f0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
1e600 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
1e610 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
1e620 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
1e630 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
1e640 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1e650 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74  oLast = pgnoLast
1e660 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
1e670 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20  >nSegment++;.   
1e680 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1e690 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30  turePromote(p, 0
1e6a0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
1e6b0 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  .  fts5IndexAuto
1e6c0 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1e6d0 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
1e6e0 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
1e6f0 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
1e700 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
1e710 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
1e720 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
1e730 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1e740 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  uct);.}../*.** F
1e750 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74  lush any data st
1e760 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
1e770 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
1e780 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1e790 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1e7a0 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68  d fts5IndexFlush
1e7b0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1e7c0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69    /* Unless it i
1e7d0 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74  s empty, flush t
1e7e0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
1e7f0 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70   disk */.  if( p
1e800 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29  ->nPendingData )
1e810 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1e820 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d  >pHash );.    p-
1e830 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
1e840 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68  0;.    fts5Flush
1e850 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a  OneHash(p);.  }.
1e860 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  }...int sqlite3F
1e870 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
1e880 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1e890 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1e8a0 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
1e8b0 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20  Structure *pNew 
1e8c0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20  = 0;.  int nSeg 
1e8d0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1e8e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e8f0 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
1e900 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75  lush(p);.  pStru
1e910 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1e920 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66  reRead(p);..  if
1e930 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
1e940 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1e950 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
1e960 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
1e970 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
1e980 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20 70 53  );.    nSeg = pS
1e990 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
1e9a0 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e 31 20  .    if( nSeg>1 
1e9b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
1e9c0 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1e9d0 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20 20  Structure);.    
1e9e0 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72    nByte += (pStr
1e9f0 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a  uct->nLevel+1) *
1ea00 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1ea10 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20  ctureLevel);.   
1ea20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53     pNew = (Fts5S
1ea30 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
1ea40 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
1ea50 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
1ea60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1ea70 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
1ea80 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1ea90 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42  pLvl;.    int nB
1eaa0 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a  yte = nSeg * siz
1eab0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1eac0 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70  eSegment);.    p
1ead0 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53  New->nLevel = pS
1eae0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b  truct->nLevel+1;
1eaf0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  .    pNew->nRef 
1eb00 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 1;.    pNew->n
1eb10 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20 70  WriteCounter = p
1eb20 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
1eb30 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20  unter;.    pLvl 
1eb40 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  = &pNew->aLevel[
1eb50 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
1eb60 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67  ;.    pLvl->aSeg
1eb70 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
1eb80 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65  eSegment*)sqlite
1eb90 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
1eba0 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
1ebb0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53      if( pLvl->aS
1ebc0 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  eg ){.      int 
1ebd0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1ebe0 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20    int iSegOut = 
1ebf0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  0;.      for(iLv
1ec00 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
1ec10 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
1ec20 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
1ec30 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
1ec40 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1ec50 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
1ec60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  {.          pLvl
1ec70 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d 20  ->aSeg[iSegOut] 
1ec80 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
1ec90 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
1eca0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53  g];.          iS
1ecb0 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20  egOut++;.       
1ecc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1ecd0 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20   pNew->nSegment 
1ece0 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e  = pLvl->nSeg = n
1ecf0 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Seg;.    }else{.
1ed00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1ed10 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
1ed20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pNew = 0;.    }.
1ed30 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 20    }..  if( pNew 
1ed40 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 20  ){.    int iLvl 
1ed50 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31  = pNew->nLevel-1
1ed60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
1ed70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ed80 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
1ed90 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20  vl].nSeg>0 ){.  
1eda0 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46      int nRem = F
1edb0 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49  TS5_OPT_WORK_UNI
1edc0 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  T;.      fts5Ind
1edd0 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
1ede0 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52  &pNew, iLvl, &nR
1edf0 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  em);.    }..    
1ee00 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
1ee10 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  te(p, pNew);.   
1ee20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1ee30 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d  lease(pNew);.  }
1ee40 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
1ee50 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1ee60 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
1ee70 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20  IndexReturn(p); 
1ee80 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
1ee90 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74  ts5IndexMerge(Ft
1eea0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
1eeb0 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53  nMerge){.  Fts5S
1eec0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1eed0 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20 3d 20  t;..  pStruct = 
1eee0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
1eef0 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72  d(p);.  if( pStr
1ef00 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d 3e  uct && pStruct->
1ef10 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 66 74  nLevel ){.    ft
1ef20 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20  s5IndexMerge(p, 
1ef30 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65  &pStruct, nMerge
1ef40 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1ef50 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74  tureWrite(p, pSt
1ef60 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73  ruct);.  }.  fts
1ef70 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1ef80 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 72  e(pStruct);..  r
1ef90 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
1efa0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61  eturn(p);.}..sta
1efb0 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
1efc0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20  listCallback(.  
1efd0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1efe0 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
1eff0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
1f000 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
1f010 0a 29 7b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  .){.  assert_nc(
1f020 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20   nChunk>=0 );.  
1f030 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a  if( nChunk>0 ){.
1f040 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1f050 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46 74  feAppendBlob((Ft
1f060 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74 65  s5Buffer*)pConte
1f070 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  xt, pChunk, nChu
1f080 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65  nk);.  }.}..type
1f090 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69  def struct Posli
1f0a0 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f  stCallbackCtx Po
1f0b0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
1f0c0 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  ;.struct Poslist
1f0d0 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20  CallbackCtx {.  
1f0e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1f0f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f100 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1f110 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74  s buffer */.  Ft
1f120 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
1f130 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1f140 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65   Restrict matche
1f150 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e  s to this column
1f160 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74 65   */.  int eState
1f170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f180 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
1f190 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ve */.};../*.** 
1f1a0 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20  TODO: Make this 
1f1b0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a  more efficient!.
1f1c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1f1d0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
1f1e0 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43  t(Fts5Colset *pC
1f1f0 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29  olset, int iCol)
1f200 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1f210 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
1f220 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1f230 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69   if( pColset->ai
1f240 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72  Col[i]==iCol ) r
1f250 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
1f260 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
1f270 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c  ic void fts5Posl
1f280 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63  istFilterCallbac
1f290 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1f2a0 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  p, .  void *pCon
1f2b0 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75  text, .  const u
1f2c0 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
1f2d0 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69  Chunk.){.  Posli
1f2e0 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70  stCallbackCtx *p
1f2f0 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 43 61  Ctx = (PoslistCa
1f300 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74  llbackCtx*)pCont
1f310 65 78 74 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ext;.  assert_nc
1f320 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
1f330 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
1f340 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
1f350 68 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20 74  hrough to find t
1f360 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74 20  he first varint 
1f370 77 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54 68  with value 1. Th
1f380 69 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  is is the.    **
1f390 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
1f3a0 78 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e  xt columns hits.
1f3b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   */.    int i = 
1f3c0 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61 72  0;.    int iStar
1f3d0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
1f3e0 70 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20  pCtx->eState==2 
1f3f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
1f400 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73  l;.      fts5Fas
1f410 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68  tGetVarint32(pCh
1f420 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20  unk, i, iCol);. 
1f430 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64       if( fts5Ind
1f440 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74  exColsetTest(pCt
1f450 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c  x->pColset, iCol
1f460 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  ) ){.        pCt
1f470 78 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a 20  x->eState = 1;. 
1f480 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f490 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
1f4a0 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31 29  t(pCtx->pBuf, 1)
1f4b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f4c0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
1f4d0 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ate = 0;.      }
1f4e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b  .    }..    do {
1f4f0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
1f500 6e 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b  nChunk && pChunk
1f510 5b 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20 20  [i]!=0x01 ){.   
1f520 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 68 75       while( pChu
1f530 6e 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20 69  nk[i] & 0x80 ) i
1f540 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  ++;.        i++;
1f550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f560 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20  f( pCtx->eState 
1f570 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
1f580 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1f590 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  lob(pCtx->pBuf, 
1f5a0 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c  &pChunk[iStart],
1f5b0 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20   i-iStart);.    
1f5c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
1f5d0 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
1f5e0 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
1f5f0 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a      iStart = i;.
1f600 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
1f610 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 75       if( i>=nChu
1f620 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
1f630 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 32  pCtx->eState = 2
1f640 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f650 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 46  .          fts5F
1f660 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
1f670 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b  Chunk, i, iCol);
1f680 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
1f690 3e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e  >eState = fts5In
1f6a0 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
1f6b0 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f  tx->pColset, iCo
1f6c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  l);.          if
1f6d0 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29  ( pCtx->eState )
1f6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1f6f0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1f700 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75  ndBlob(pCtx->pBu
1f710 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72  f, &pChunk[iStar
1f720 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20  t], i-iStart);. 
1f730 20 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72             iStar
1f740 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
1f750 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1f760 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
1f770 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d   i<nChunk );.  }
1f780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
1f790 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
1f7a0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  ly points to a v
1f7b0 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20  alid entry (not 
1f7c0 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75  EOF). This.** fu
1f7d0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74  nction appends t
1f7e0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
1f7f0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75   data for the cu
1f800 72 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a  rrent entry to.*
1f810 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 49  * buffer pBuf. I
1f820 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  t does not make 
1f830 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
1f840 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
1f850 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  .** field..*/.st
1f860 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
1f870 67 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20  giterPoslist(.  
1f880 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1f890 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1f8a0 67 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  g,.  Fts5Colset 
1f8b0 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35  *pColset,.  Fts5
1f8c0 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a  Buffer *pBuf.){.
1f8d0 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66    if( 0==fts5Buf
1f8e0 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
1f8f0 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  pBuf, pSeg->nPos
1f900 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ) ){.    if( pCo
1f910 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lset==0 ){.     
1f920 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
1f930 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
1f940 2a 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c  *)pBuf, fts5Posl
1f950 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  istCallback);.  
1f960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
1f970 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
1f980 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 73 43  x sCtx;.      sC
1f990 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a  tx.pBuf = pBuf;.
1f9a0 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73        sCtx.pCols
1f9b0 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
1f9c0 20 20 20 20 73 43 74 78 2e 65 53 74 61 74 65 20      sCtx.eState 
1f9d0 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  = fts5IndexColse
1f9e0 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30  tTest(pColset, 0
1f9f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fa00 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20   sCtx.eState==0 
1fa10 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d  || sCtx.eState==
1fa20 31 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43  1 );.      fts5C
1fa30 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
1fa40 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74  Seg, (void*)&sCt
1fa50 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69  x, fts5PoslistFi
1fa60 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  lterCallback);. 
1fa70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1fa80 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74  * IN/OUT paramet
1fa90 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20  er (*pa) points 
1faa0 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69  to a position li
1fab0 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69  st n bytes in si
1fac0 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f  ze. If.** the po
1fad0 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
1fae0 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
1faf0 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68   column iCol, th
1fb00 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a  en (*pa) is set.
1fb10 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ** to point to t
1fb20 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d  he sub-position-
1fb30 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f  list for that co
1fb40 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d  lumn and the num
1fb50 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20  ber of.** bytes 
1fb60 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20  in it returned. 
1fb70 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d  Or, if the argum
1fb80 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ent position lis
1fb90 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f  t does not.** co
1fba0 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65  ntain any entrie
1fbb0 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  s for column iCo
1fbc0 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  l, return 0..*/.
1fbd0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
1fbe0 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a  ndexExtractCol(.
1fbf0 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c    const u8 **pa,
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc10 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69    /* IN/OUT: Poi
1fc20 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20  nter to poslist 
1fc30 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65       /* IN: Size
1fc60 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62   of poslist in b
1fc70 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ytes */.  int iC
1fc80 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
1fc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1fca0 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66  umn to extract f
1fcb0 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29  rom poslist */.)
1fcc0 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  {.  int iCurrent
1fcd0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1fce0 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20      /* Anything 
1fcf0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1fd00 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a   0x01 is col 0 *
1fd10 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20  /.  const u8 *p 
1fd20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75  = *pa;.  const u
1fd30 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b  8 *pEnd = &p[n];
1fd40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1fd50 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
1fd60 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
1fd70 2f 0a 20 20 75 38 20 70 72 65 76 20 3d 20 30 3b  /.  u8 prev = 0;
1fd80 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e  ..  while( iCol>
1fd90 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
1fda0 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  /* Advance point
1fdb0 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f  er p until it po
1fdc0 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20  ints to pEnd or 
1fdd0 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61  an 0x01 byte tha
1fde0 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  t is.    ** not 
1fdf0 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
1fe00 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 28   */.    while( (
1fe10 70 72 65 76 20 26 20 30 78 38 30 29 20 7c 7c 20  prev & 0x80) || 
1fe20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20  *p!=0x01 ){.    
1fe30 20 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20    prev = *p++;. 
1fe40 20 20 20 20 20 69 66 28 20 70 3d 3d 70 45 6e 64       if( p==pEnd
1fe50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1fe60 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b   }.    *pa = p++
1fe70 3b 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47  ;.    p += fts5G
1fe80 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 69 43  etVarint32(p, iC
1fe90 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  urrent);.  }.  i
1fea0 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e  f( iCol!=iCurren
1feb0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
1fec0 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
1fed0 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70  ter p until it p
1fee0 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
1fef0 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68   an 0x01 byte th
1ff00 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70  at is.  ** not p
1ff10 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20  art of a varint 
1ff20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 72  */.  assert( (pr
1ff30 65 76 20 26 20 30 78 38 30 29 3d 3d 30 20 29 3b  ev & 0x80)==0 );
1ff40 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64  .  while( p<pEnd
1ff50 20 26 26 20 28 28 70 72 65 76 20 26 20 30 78 38   && ((prev & 0x8
1ff60 30 29 20 7c 7c 20 2a 70 21 3d 30 78 30 31 29 20  0) || *p!=0x01) 
1ff70 29 7b 0a 20 20 20 20 70 72 65 76 20 3d 20 2a 70  ){.    prev = *p
1ff80 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
1ff90 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 0a   p - (*pa);.}...
1ffa0 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
1ffb0 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20  Multi currently 
1ffc0 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
1ffd0 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46  d entry (not EOF
1ffe0 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
1fff0 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20  ion appends the 
20000 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20 62 75 66  following to buf
20010 66 65 72 20 70 42 75 66 3a 0a 2a 2a 0a 2a 2a 20  fer pBuf:.**.** 
20020 20 20 2a 20 54 68 65 20 76 61 72 69 6e 74 20 69    * The varint i
20030 44 65 6c 74 61 2c 20 61 6e 64 0a 2a 2a 20 20 20  Delta, and.**   
20040 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  * the position l
20050 69 73 74 20 74 68 61 74 20 63 75 72 72 65 6e 74  ist that current
20060 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 69 6e  ly points to, in
20070 63 6c 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65  cluding the size
20080 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   field..**.** If
20090 20 61 72 67 75 6d 65 6e 74 20 70 43 6f 6c 73 65   argument pColse
200a0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
200b0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
200c0 74 20 69 73 20 66 69 6c 74 65 72 65 64 20 61 63  t is filtered ac
200d0 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 43  cording.** to pC
200e0 6f 6c 73 65 74 20 62 65 66 6f 72 65 20 62 65 69  olset before bei
200f0 6e 67 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ng appended to t
20100 68 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  he buffer. If th
20110 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  is means there a
20120 72 65 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  re.** no entries
20130 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
20140 20 6c 69 73 74 2c 20 6e 6f 74 68 69 6e 67 20 69   list, nothing i
20150 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
20160 65 20 62 75 66 66 65 72 20 28 6e 6f 74 0a 2a 2a  e buffer (not.**
20170 20 65 76 65 6e 20 69 44 65 6c 74 61 29 2e 0a 2a   even iDelta)..*
20180 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
20190 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
201a0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
201b0 6e 20 70 2d 3e 72 63 2e 20 0a 2a 2f 0a 73 74 61  n p->rc. .*/.sta
201c0 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 70 65  tic int fts5Appe
201d0 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  ndPoslist(.  Fts
201e0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34  5Index *p,.  i64
201f0 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49   iDelta,.  Fts5I
20200 6e 64 65 78 49 74 65 72 20 2a 70 4d 75 6c 74 69  ndexIter *pMulti
20210 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  ,.  Fts5Colset *
20220 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42  pColset,.  Fts5B
20230 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
20240 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
20250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
20260 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
20270 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20   &pMulti->aSeg[ 
20280 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31  pMulti->aFirst[1
20290 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
202a0 61 73 73 65 72 74 28 20 66 74 73 35 4d 75 6c 74  assert( fts5Mult
202b0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c  iIterEof(p, pMul
202c0 74 69 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ti)==0 );.    as
202d0 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 50 6f 73  sert( pSeg->nPos
202e0 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >0 );.    if( 0=
202f0 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28  =fts5BufferGrow(
20300 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53  &p->rc, pBuf, pS
20310 65 67 2d 3e 6e 50 6f 73 2b 39 2b 39 29 20 29 7b  eg->nPos+9+9) ){
20320 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  ..      if( pSeg
20330 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
20340 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e  eg->nPos<=pSeg->
20350 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20  pLeaf->szLeaf . 
20360 20 20 20 20 20 20 26 26 20 28 70 43 6f 6c 73 65        && (pColse
20370 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 73 65 74 2d  t==0 || pColset-
20380 3e 6e 43 6f 6c 3d 3d 31 29 0a 20 20 20 20 20 20  >nCol==1).      
20390 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
203a0 20 75 38 20 2a 70 50 6f 73 20 3d 20 26 70 53 65   u8 *pPos = &pSe
203b0 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67  g->pLeaf->p[pSeg
203c0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
203d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
203e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
203f0 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  olset ){.       
20400 20 20 20 6e 50 6f 73 20 3d 20 66 74 73 35 49 6e     nPos = fts5In
20410 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70  dexExtractCol(&p
20420 50 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  Pos, pSeg->nPos,
20430 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b   pColset->aiCol[
20440 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0]);.          i
20450 66 28 20 6e 50 6f 73 3d 3d 30 20 29 20 72 65 74  f( nPos==0 ) ret
20460 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
20470 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20480 6e 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  nPos = pSeg->nPo
20490 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s;.        }.   
204a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 6f       assert( nPo
204b0 73 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 66  s>0 );.        f
204c0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
204d0 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
204e0 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
204f0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
20500 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
20510 2c 20 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20  , nPos*2);.     
20520 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
20530 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
20540 2c 20 70 50 6f 73 2c 20 6e 50 6f 73 29 3b 0a 20  , pPos, nPos);. 
20550 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20560 20 20 20 20 69 6e 74 20 69 53 76 31 3b 0a 20 20      int iSv1;.  
20570 20 20 20 20 20 20 69 6e 74 20 69 53 76 32 3b 0a        int iSv2;.
20580 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 61 74          int iDat
20590 61 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  a;..        /* A
205a0 70 70 65 6e 64 20 69 44 65 6c 74 61 20 2a 2f 0a  ppend iDelta */.
205b0 20 20 20 20 20 20 20 20 69 53 76 31 20 3d 20 70          iSv1 = p
205c0 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Buf->n;.        
205d0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
205e0 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c  pendVarint(pBuf,
205f0 20 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20 20 20   iDelta);..     
20600 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
20610 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
20620 20 20 69 53 76 32 20 3d 20 70 42 75 66 2d 3e 6e    iSv2 = pBuf->n
20630 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
20640 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
20650 72 69 6e 74 28 70 42 75 66 2c 20 70 53 65 67 2d  rint(pBuf, pSeg-
20660 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20  >nPos*2);.      
20670 20 20 69 44 61 74 61 20 3d 20 70 42 75 66 2d 3e    iData = pBuf->
20680 6e 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35  n;..        fts5
20690 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
206a0 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c  , pSeg, pColset,
206b0 20 70 42 75 66 29 3b 0a 0a 20 20 20 20 20 20 20   pBuf);..       
206c0 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 0a   if( pColset ){.
206d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41            int nA
206e0 63 74 75 61 6c 20 3d 20 70 42 75 66 2d 3e 6e 20  ctual = pBuf->n 
206f0 2d 20 69 44 61 74 61 3b 0a 20 20 20 20 20 20 20  - iData;.       
20700 20 20 20 69 66 28 20 6e 41 63 74 75 61 6c 21 3d     if( nActual!=
20710 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20  pSeg->nPos ){.  
20720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
20730 63 74 75 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ctual==0 ){.    
20740 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
20750 6e 20 3d 20 69 53 76 31 3b 0a 20 20 20 20 20 20  n = iSv1;.      
20760 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
20770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
20780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
20790 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 73 71     int nReq = sq
207a0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
207b0 6e 74 4c 65 6e 28 28 75 33 32 29 28 6e 41 63 74  ntLen((u32)(nAct
207c0 75 61 6c 2a 32 29 29 3b 0a 20 20 20 20 20 20 20  ual*2));.       
207d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 53         while( iS
207e0 76 32 3c 28 69 44 61 74 61 2d 6e 52 65 71 29 20  v2<(iData-nReq) 
207f0 29 7b 20 70 42 75 66 2d 3e 70 5b 69 53 76 32 2b  ){ pBuf->p[iSv2+
20800 2b 5d 20 3d 20 30 78 38 30 3b 20 7d 0a 20 20 20  +] = 0x80; }.   
20810 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20820 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
20830 26 70 42 75 66 2d 3e 70 5b 69 53 76 32 5d 2c 20  &pBuf->p[iSv2], 
20840 6e 41 63 74 75 61 6c 2a 32 29 3b 0a 20 20 20 20  nActual*2);.    
20850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20870 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20        }..    }. 
20880 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
20890 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
208a0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
208b0 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74  xt(Fts5DoclistIt
208c0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38  er *pIter){.  u8
208d0 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f   *p = pIter->aPo
208e0 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e  slist + pIter->n
208f0 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50  Size + pIter->nP
20900 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72  oslist;..  asser
20910 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69  t( pIter->aPosli
20920 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70  st );.  if( p>=p
20930 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20  Iter->aEof ){.  
20940 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
20950 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
20960 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
20970 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65  .    p += fts5Ge
20980 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36 34 2a  tVarint(p, (u64*
20990 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70  )&iDelta);.    p
209a0 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
209b0 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20  iDelta;..    /* 
209c0 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69  Read position li
209d0 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  st size */.    i
209e0 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30 20 29  f( p[0] & 0x80 )
209f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73  {.      int nPos
20a00 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
20a10 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74 56 61  Size = fts5GetVa
20a20 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b  rint32(p, nPos);
20a30 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
20a40 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e  oslist = (nPos>>
20a50 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
20a60 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
20a70 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70 5b  list = ((int)(p[
20a80 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20  0])) >> 1;.     
20a90 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20   pIter->nSize = 
20aa0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49  1;.    }..    pI
20ab0 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
20ac0 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  p;.  }.}..static
20ad0 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73   void fts5Doclis
20ae0 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  tIterInit(.  Fts
20af0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a  5Buffer *pBuf, .
20b00 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
20b10 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65  r *pIter.){.  me
20b20 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
20b30 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
20b40 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
20b50 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70  t = pBuf->p;.  p
20b60 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42  Iter->aEof = &pB
20b70 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a  uf->p[pBuf->n];.
20b80 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
20b90 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a  rNext(pIter);.}.
20ba0 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70  .#if 0./*.** App
20bb0 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f  end a doclist to
20bc0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
20bd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20be0 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 73  n assumes that s
20bf0 70 61 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  pace within the 
20c00 62 75 66 66 65 72 20 68 61 73 20 61 6c 72 65 61  buffer has alrea
20c10 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63  dy been.** alloc
20c20 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
20c30 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70  void fts5MergeAp
20c40 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46 74 73  pendDocid(.  Fts
20c50 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20  5Buffer *pBuf,  
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c70 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20  Buffer to write 
20c80 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c  to */.  i64 *piL
20c90 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20  astRowid,       
20ca0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
20cb0 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  T: Previous rowi
20cc0 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e  d written (if an
20cd0 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  y) */.  i64 iRow
20ce0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
20cf0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
20d00 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   to append */.){
20d10 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d  .  assert( pBuf-
20d20 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73  >n!=0 || (*piLas
20d30 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20  tRowid)==0 );.  
20d40 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
20d50 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c  pendVarint(pBuf,
20d60 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73   iRowid - *piLas
20d70 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61  tRowid);.  *piLa
20d80 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
20d90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  ;.}.#endif..#def
20da0 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41 70 70  ine fts5MergeApp
20db0 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c 20 69  endDocid(pBuf, i
20dc0 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77 69  LastRowid, iRowi
20dd0 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20 20 61  d) {       \.  a
20de0 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e  ssert( (pBuf)->n
20df0 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77  !=0 || (iLastRow
20e00 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  id)==0 );       
20e10 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
20e20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
20e30 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42 75 66  pendVarint((pBuf
20e40 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20 28 69  ), (iRowid) - (i
20e50 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20  LastRowid)); \. 
20e60 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20 3d 20   (iLastRowid) = 
20e70 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20 20 20  (iRowid);       
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
20ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
20eb0 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
20ec0 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
20ed0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
20ee0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
20ef0 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
20f00 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
20f10 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
20f20 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
20f30 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
20f40 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
20f50 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
20f60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
20f70 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
20f80 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
20f90 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
20fa0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
20fb0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
20fc0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
20fd0 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
20fe0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
20ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21000 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
21010 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
21020 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
21050 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
21060 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
21070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21080 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
21090 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  rge */.){.  if( 
210a0 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34  p2->n ){.    i64
210b0 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
210c0 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
210d0 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73  Iter i1;.    Fts
210e0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b  5DoclistIter i2;
210f0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
21100 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66  out;.    Fts5Buf
21110 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d  fer tmp;.    mem
21120 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a  set(&out, 0, siz
21130 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d  eof(out));.    m
21140 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73  emset(&tmp, 0, s
21150 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20  izeof(tmp));..  
21160 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
21170 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
21180 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32  &out, p1->n + p2
21190 2d 3e 6e 29 3b 0a 20 20 20 20 66 74 73 35 44 6f  ->n);.    fts5Do
211a0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31  clistIterInit(p1
211b0 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35  , &i1);.    fts5
211c0 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28  DoclistIterInit(
211d0 70 32 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68  p2, &i2);.    wh
211e0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
211f0 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50 6f  TE_OK && (i1.aPo
21200 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61  slist!=0 || i2.a
21210 50 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a 20  Poslist!=0) ){. 
21220 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f 73       if( i2.aPos
21230 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61  list==0 || (i1.a
21240 50 6f 73 6c 69 73 74 20 26 26 20 69 31 2e 69 52  Poslist && i1.iR
21250 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20  owid<i2.iRowid) 
21260 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
21270 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31  py entry from i1
21280 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
21290 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
212a0 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
212b0 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i1.iRowid);. 
212c0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
212d0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
212e0 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
212f0 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69  t, i1.nPoslist+i
21300 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  1.nSize);.      
21310 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
21320 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20  rNext(&i1);.    
21330 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69    }.      else i
21340 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i1.aPoslist==
21350 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d  0 || i2.iRowid!=
21360 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  i1.iRowid ){.   
21370 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
21380 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20  ry from i2 */.  
21390 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
213a0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
213b0 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e   iLastRowid, i2.
213c0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
213d0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
213e0 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
213f0 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.aPoslist, i2.
21400 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a  nPoslist+i2.nSiz
21410 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  e);.        fts5
21420 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
21430 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &i2);.      }.  
21440 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
21450 20 20 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b    i64 iPos1 = 0;
21460 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f  .        i64 iPo
21470 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s2 = 0;.        
21480 69 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20  int iOff1 = 0;. 
21490 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32         int iOff2
214a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
214b0 20 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c   *a1 = &i1.aPosl
214c0 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20  ist[i1.nSize];. 
214d0 20 20 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20         u8 *a2 = 
214e0 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e  &i2.aPoslist[i2.
214f0 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20  nSize];..       
21500 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
21510 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 20  er writer;.     
21520 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65     memset(&write
21530 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69  r, 0, sizeof(wri
21540 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  ter));..        
21550 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f  /* Merge the two
21560 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e   position lists.
21570 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 66 74 73   */ .        fts
21580 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
21590 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
215a0 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
215b0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
215c0 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 0a 20  erZero(&tmp);.. 
215d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
215e0 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
215f0 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
21600 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
21610 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21620 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
21630 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69  64(a2, i2.nPosli
21640 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f  st, &iOff2, &iPo
21650 73 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 77 68  s2);..        wh
21660 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
21670 54 45 5f 4f 4b 20 26 26 20 28 69 50 6f 73 31 3e  TE_OK && (iPos1>
21680 3d 30 20 7c 7c 20 69 50 6f 73 32 3e 3d 30 29 20  =0 || iPos2>=0) 
21690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
216a0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
216b0 20 69 66 28 20 69 50 6f 73 32 3c 30 20 7c 7c 20   if( iPos2<0 || 
216c0 28 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f  (iPos1>=0 && iPo
216d0 73 31 3c 69 50 6f 73 32 29 20 29 7b 0a 20 20 20  s1<iPos2) ){.   
216e0 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
216f0 69 50 6f 73 31 3b 0a 20 20 20 20 20 20 20 20 20  iPos1;.         
21700 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
21710 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20  slistNext64(a1, 
21720 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i1.nPoslist, &iO
21730 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20  ff1, &iPos1);.  
21740 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21750 20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20             iNew 
21760 3d 20 69 50 6f 73 32 3b 0a 20 20 20 20 20 20 20  = iPos2;.       
21770 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
21780 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32  PoslistNext64(a2
21790 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
217a0 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a  iOff2, &iPos2);.
217b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
217c0 69 50 6f 73 31 3d 3d 69 50 6f 73 32 20 29 7b 0a  iPos1==iPos2 ){.
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
217e0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
217f0 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
21800 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 26  oslist, &iOff1,&
21810 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
21820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21830 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  }.          p->r
21840 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  c = sqlite3Fts5P
21850 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65  oslistWriterAppe
21860 6e 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72  nd(&tmp, &writer
21870 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , iNew);.       
21880 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
21890 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
218a0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
218b0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
218c0 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e  arint(&out, tmp.
218d0 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20  n * 2);.        
218e0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
218f0 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74  pendBlob(&out, t
21900 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20  mp.p, tmp.n);.  
21910 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
21920 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
21930 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
21940 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
21950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21960 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
21970 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f  et(&p->rc, p1, o
21980 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20  ut.n, out.p);.  
21990 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
219a0 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35  (&tmp);.    fts5
219b0 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29  BufferFree(&out)
219c0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
219d0 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53  void fts5BufferS
219e0 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a  wap(Fts5Buffer *
219f0 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  p1, Fts5Buffer *
21a00 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65  p2){.  Fts5Buffe
21a10 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a  r tmp = *p1;.  *
21a20 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20  p1 = *p2;.  *p2 
21a30 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63  = tmp;.}..static
21a40 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70 50   void fts5SetupP
21a50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74 73  refixIter(.  Fts
21a60 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a80 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66 72  Index to read fr
21a90 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  om */.  int bDes
21aa0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
21ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21ac0 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f  for "ORDER BY ro
21ad0 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63  wid DESC" */.  c
21ae0 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c  onst u8 *pToken,
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b00 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
21b10 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61  ing prefix to ma
21b20 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  tch */.  int nTo
21b30 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
21b40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
21b50 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65   of buffer pToke
21b60 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
21b70 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
21b80 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
21b90 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63  /* Restrict matc
21ba0 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c  hes to these col
21bb0 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e  umns */.  Fts5In
21bc0 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72  dexIter **ppIter
21bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
21be0 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a  : New iterator *
21bf0 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
21c00 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
21c10 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75   Fts5Buffer *aBu
21c20 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  f;.  const int n
21c30 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75  Buf = 32;..  aBu
21c40 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a  f = (Fts5Buffer*
21c50 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
21c60 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
21c70 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53  fer)*nBuf);.  pS
21c80 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
21c90 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20  ctureRead(p);.. 
21ca0 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74   if( aBuf && pSt
21cb0 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73  ruct ){.    cons
21cc0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54  t int flags = FT
21cd0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
21ce0 41 4e 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  AN;.    int i;. 
21cf0 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69     i64 iLastRowi
21d00 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 49  d = 0;.    Fts5I
21d10 6e 64 65 78 49 74 65 72 20 2a 70 31 20 3d 20 30  ndexIter *p1 = 0
21d20 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  ;     /* Iterato
21d30 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72  r used to gather
21d40 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78   data from index
21d50 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61   */.    Fts5Data
21d60 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73   *pData;.    Fts
21d70 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b  5Buffer doclist;
21d80 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72  .    int bNewTer
21d90 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73  m = 1;..    mems
21da0 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20  et(&doclist, 0, 
21db0 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29  sizeof(doclist))
21dc0 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75  ;.    for(fts5Mu
21dd0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
21de0 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c  truct, 1, flags,
21df0 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
21e00 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20   -1, 0, &p1);.  
21e10 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
21e20 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30  terEof(p, p1)==0
21e30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
21e40 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c 20  ltiIterNext2(p, 
21e50 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a 20  p1, &bNewTerm). 
21e60 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20     ){.      i64 
21e70 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c  iRowid = fts5Mul
21e80 74 69 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b  tiIterRowid(p1);
21e90 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
21ea0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
21eb0 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75   *pTerm = fts5Mu
21ec0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20  ltiIterTerm(p1, 
21ed0 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61  &nTerm);.      a
21ee0 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70  ssert_nc( memcmp
21ef0 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
21f00 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72  MIN(nToken, nTer
21f10 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20  m))<=0 );.      
21f20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
21f30 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72          if( nTer
21f40 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63  m<nToken || memc
21f50 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
21f60 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61  , nToken) ) brea
21f70 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
21f80 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e    if( doclist.n>
21f90 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61  0 && iRowid<=iLa
21fa0 73 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  stRowid ){.     
21fb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
21fc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21fd0 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b  doclist.n; i++){
21fe0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21ff0 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20  t( i<nBuf );.   
22000 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b         if( aBuf[
22010 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i].n==0 ){.     
22020 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
22030 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20  rSwap(&doclist, 
22040 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
22050 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
22060 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b  rZero(&doclist);
22070 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
22080 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
22090 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
220a0 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ts(p, &doclist, 
220b0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
220c0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
220d0 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b  rZero(&aBuf[i]);
220e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
220f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22100 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
22110 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
22120 28 20 21 66 74 73 35 41 70 70 65 6e 64 50 6f 73  ( !fts5AppendPos
22130 6c 69 73 74 28 70 2c 20 69 52 6f 77 69 64 2d 69  list(p, iRowid-i
22140 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 70  LastRowid, p1, p
22150 43 6f 6c 73 65 74 2c 20 26 64 6f 63 6c 69 73 74  Colset, &doclist
22160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  ) ){.        iLa
22170 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
22180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22190 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
221a0 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
221b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
221c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
221d0 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69    fts5MergePrefi
221e0 78 4c 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69  xLists(p, &docli
221f0 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
22200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
22210 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42 75  5BufferFree(&aBu
22220 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  f[i]);.    }.   
22230 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
22240 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20  ee(p, p1);..    
22250 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d  pData = fts5IdxM
22260 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
22270 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c  Fts5Data) + docl
22280 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20  ist.n);.    if( 
22290 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70  pData ){.      p
222a0 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26  Data->p = (u8*)&
222b0 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20  pData[1];.      
222c0 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74  pData->nn = pDat
222d0 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c  a->szLeaf = docl
222e0 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d  ist.n;.      mem
222f0 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f  cpy(pData->p, do
22300 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74  clist.p, doclist
22310 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  .n);.      fts5M
22320 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20  ultiIterNew2(p, 
22330 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70  pData, bDesc, pp
22340 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
22350 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
22360 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a  &doclist);.  }..
22370 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
22380 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
22390 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
223a0 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  aBuf);.}.../*.**
223b0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
223c0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ll subsequent ca
223d0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
223e0 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
223f0 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65  ertain.** to the
22400 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
22410 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a  owid iRowid..*/.
22420 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
22430 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46  ndexBeginWrite(F
22440 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
22450 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52   bDelete, i64 iR
22460 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28  owid){.  assert(
22470 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
22480 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  K );..  /* Alloc
22490 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ate the hash tab
224a0 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  le if it has not
224b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
224c0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28  located */.  if(
224d0 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a   p->pHash==0 ){.
224e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
224f0 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 26  te3Fts5HashNew(&
22500 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50  p->pHash, &p->nP
22510 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d  endingData);.  }
22520 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
22530 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64   hash table to d
22540 69 73 6b 20 69 66 20 72 65 71 75 69 72 65 64 20  isk if required 
22550 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c  */.  if( iRowid<
22560 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a  p->iWriteRowid .
22570 20 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70     || (iRowid==p
22580 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26 26  ->iWriteRowid &&
22590 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a   p->bDelete==0).
225a0 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69     || (p->nPendi
225b0 6e 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e  ngData > p->pCon
225c0 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20  fig->nHashSize) 
225d0 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  .  ){.    fts5In
225e0 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
225f0 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  ..  p->iWriteRow
22600 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
22610 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c  ->bDelete = bDel
22620 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ete;.  return ft
22630 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
22640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
22650 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a  t data to disk..
22660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22670 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
22680 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43  Index *p, int bC
22690 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74  ommit){.  assert
226a0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
226b0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
226c0 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28  xFlush(p);.  if(
226d0 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43   bCommit ) fts5C
226e0 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
226f0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
22700 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
22710 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79  *.** Discard any
22720 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
22730 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
22740 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f  sh tables. Do no
22750 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f  t write it.** to
22760 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
22770 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73  dditionally, ass
22780 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ume that the con
22790 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64  tents of the %_d
227a0 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  ata.** table may
227b0 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e   have changed on
227c0 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e   disk. So any in
227d0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f  -memory caches o
227e0 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63  f %_data .** rec
227f0 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76  ords must be inv
22800 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  alidated..*/.int
22810 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22820 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e  xRollback(Fts5In
22830 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43  dex *p){.  fts5C
22840 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
22850 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
22860 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65  dData(p);.  asse
22870 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
22880 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
22890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
228a0 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
228b0 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
228c0 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74  ely empty when t
228d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
228e0 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20  called. This.** 
228f0 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
22900 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69  es it with the i
22910 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65  nitial structure
22920 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
22930 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20  h index,.** and 
22940 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73  the initial vers
22950 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72  ion of the "aver
22960 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20  ages" record (a 
22970 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e  zero-byte blob).
22980 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
22990 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46  ts5IndexReinit(F
229a0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
229b0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b  Fts5Structure s;
229c0 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
229d0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
229e0 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44  cture));.  fts5D
229f0 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
22a00 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
22a10 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20   (const u8*)"", 
22a20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  0);.  fts5Struct
22a30 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b  ureWrite(p, &s);
22a40 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
22a50 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
22a60 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
22a70 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  w Fts5Index hand
22a80 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61  le. If the bCrea
22a90 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  te argument is t
22aa0 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61  rue, create.** a
22ab0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
22ac0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64  e underlying %_d
22ad0 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
22ae0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
22af0 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
22b00 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
22b10 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
22b20 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65  LITE_OK..** Othe
22b30 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74  rwise, set *pp t
22b40 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72  o NULL and retur
22b50 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
22b60 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
22b70 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
22b80 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  pen(.  Fts5Confi
22b90 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69  g *pConfig, .  i
22ba0 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46  nt bCreate, .  F
22bb0 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20  ts5Index **pp,. 
22bc0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
22bd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22be0 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64  TE_OK;.  Fts5Ind
22bf0 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ex *p;          
22c00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
22c10 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70  object */..  *pp
22c20 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65   = p = (Fts5Inde
22c30 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  x*)sqlite3Fts5Ma
22c40 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
22c50 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
22c60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
22c80 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69  pConfig = pConfi
22c90 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55  g;.    p->nWorkU
22ca0 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f  nit = FTS5_WORK_
22cb0 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61  UNIT;.    p->zDa
22cc0 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46  taTbl = sqlite3F
22cd0 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20  ts5Mprintf(&rc, 
22ce0 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66  "%s_data", pConf
22cf0 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ig->zName);.    
22d00 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20  if( p->zDataTbl 
22d10 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20  && bCreate ){.  
22d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22d30 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28  Fts5CreateTable(
22d40 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
22d50 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20  ig, "data", "id 
22d60 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
22d70 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22  KEY, block BLOB"
22d80 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20  , 0, pzErr.     
22d90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
22da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22db0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22dc0 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
22dd0 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78  le(pConfig, "idx
22de0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
22df0 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67  "segid, term, pg
22e00 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  no, PRIMARY KEY(
22e10 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a  segid, term)", .
22e20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 70              1, p
22e30 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  zErr.        );.
22e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22e60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22e70 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22e80 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20  Reinit(p);.     
22e90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22ea0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22eb0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
22ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
22ed0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
22ee0 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
22ef0 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d  se(p);.    *pp =
22f00 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
22f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
22f20 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
22f30 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
22f40 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
22f50 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29  3Fts5IndexOpen()
22f60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22f70 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
22f80 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
22f90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22fa0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  OK;.  if( p ){. 
22fb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
22fc0 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
22fd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22fe0 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
22ff0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
23000 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ze(p->pDeleter);
23010 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
23020 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69  alize(p->pIdxWri
23030 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
23040 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49  3_finalize(p->pI
23050 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20  dxDeleter);.    
23060 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
23070 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b  (p->pIdxSelect);
23080 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
23090 48 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73  HashFree(p->pHas
230a0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
230b0 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c  free(p->zDataTbl
230c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
230d0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ree(p);.  }.  re
230e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
230f0 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69  * Argument p poi
23100 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
23110 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38  containing utf-8
23120 20 74 65 78 74 20 74 68 61 74 20 69 73 20 6e 20   text that is n 
23130 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a  bytes in .** siz
23140 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  e. Return the nu
23150 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
23160 20 74 68 65 20 6e 43 68 61 72 20 63 68 61 72 61   the nChar chara
23170 63 74 65 72 20 70 72 65 66 69 78 20 6f 66 20 74  cter prefix of t
23180 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72  he.** buffer, or
23190 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
231a0 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20  less than nChar 
231b0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f  characters in to
231c0 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tal..*/.static i
231d0 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72  nt fts5IndexChar
231e0 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e  lenToBytelen(con
231f0 73 74 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20  st char *p, int 
23200 6e 42 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72  nByte, int nChar
23210 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
23220 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
23230 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
23240 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42  ){.    if( n>=nB
23250 79 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  yte ) return 0; 
23260 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f       /* Input co
23270 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61  ntains fewer tha
23280 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f  n nChar chars */
23290 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
232a0 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d  ed char)p[n++]>=
232b0 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
232c0 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63  ile( (p[n] & 0xc
232d0 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a  0)==0x80 ) n++;.
232e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
232f0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn n;.}../*.** p
23300 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e  In is a UTF-8 en
23310 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49  coded string, nI
23320 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
23330 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
23340 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65  er of.** unicode
23350 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
23360 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  he string..*/.st
23370 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
23380 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20  exCharlen(const 
23390 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e  char *pIn, int n
233a0 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  In){.  int nChar
233b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
233c0 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20   .  int i = 0;. 
233d0 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b   while( i<nIn ){
233e0 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
233f0 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d  ed char)pIn[i++]
23400 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
23410 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20  while( i<nIn && 
23420 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d  (pIn[i] & 0xc0)=
23430 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20  =0x80 ) i++;.   
23440 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a   }.    nChar++;.
23450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
23460 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ar;.}../*.** Ins
23470 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61  ert or remove da
23480 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ta to or from th
23490 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69  e index. Each ti
234a0 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73  me a document is
234b0 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72   .** added to or
234c0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
234d0 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75  e index, this fu
234e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
234f0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
23500 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  times..**.** For
23510 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d   an insert, it m
23520 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  ust be called on
23530 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
23540 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  n in the new doc
23550 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65  ument..** If the
23560 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
23570 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20  delete, it must 
23580 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65  be called (at le
23590 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61  ast) once for ea
235a0 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b  ch.** unique tok
235b0 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  en in the docume
235c0 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20  nt with an iCol 
235d0 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
235e0 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a  zero. The iPos.*
235f0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67  * argument is ig
23600 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65  nored for a dele
23610 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te..*/.int sqlit
23620 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
23630 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
23640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23650 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
23660 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  write to */.  in
23670 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23690 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70   Column token ap
236a0 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e  pears in (-ve ->
236b0 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e   delete) */.  in
236c0 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236e0 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
236f0 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e  en within column
23700 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
23710 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
23720 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74  oken  /* Token t
23730 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  o add or remove 
23740 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78  to or from index
23750 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
23780 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
23790 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ugh indexes */. 
237a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
237b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
237c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
237d0 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
237e0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
237f0 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74  onfig;..  assert
23800 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
23810 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
23820 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65  (iCol<0)==p->bDe
23830 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  lete );..  /* Ad
23840 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74  d the entry to t
23850 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e  he main terms in
23860 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  dex. */.  rc = s
23870 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
23880 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48  ite(.      p->pH
23890 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f  ash, p->iWriteRo
238a0 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
238b0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
238c0 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  X, pToken, nToke
238d0 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  n.  );..  for(i=
238e0 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  0; i<pConfig->nP
238f0 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c  refix && rc==SQL
23900 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
23910 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74    int nByte = ft
23920 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
23930 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20  Bytelen(pToken, 
23940 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d  nToken, pConfig-
23950 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20  >aPrefix[i]);.  
23960 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
23970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23980 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 70  3Fts5HashWrite(p
23990 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20  ->pHash, .      
239a0 20 20 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77      p->iWriteRow
239b0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
239c0 28 63 68 61 72 29 28 46 54 53 35 5f 4d 41 49 4e  (char)(FTS5_MAIN
239d0 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c 20 70 54  _PREFIX+i+1), pT
239e0 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  oken,.          
239f0 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20  nByte.      );. 
23a00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
23a10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23a20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61  Open a new itera
23a30 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  tor to iterate t
23a40 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 20  hough all rowid 
23a50 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a  that match the .
23a60 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b  ** specified tok
23a70 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
23a80 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ix..*/.int sqlit
23a90 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
23aa0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
23ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23ac0 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78      /* FTS index
23ad0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
23ae0 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
23af0 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f  n, int nToken, /
23b00 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66  * Token (or pref
23b10 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ix) to query for
23b20 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
23b50 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
23b60 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  _X flags */.  Ft
23b70 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
23b80 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
23b90 20 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c   Match these col
23ba0 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46  umns only */.  F
23bb0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
23bc0 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  pIter          /
23bd0 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61  * OUT: New itera
23be0 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  tor object */.){
23bf0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
23c00 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
23c10 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  fig;.  Fts5Index
23c20 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Iter *pRet = 0;.
23c30 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
23c40 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
23c50 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
23c60 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   /* If the QUERY
23c70 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65  _SCAN flag is se
23c80 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  t, all other fla
23c90 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  gs must be clear
23ca0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
23cb0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
23cc0 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30  X_QUERY_SCAN)==0
23cd0 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49   || flags==FTS5I
23ce0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
23cf0 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
23d00 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
23d10 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54  &p->rc, &buf, nT
23d20 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20  oken+1)==0 ){.  
23d30 20 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b    memcpy(&buf.p[
23d40 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  1], pToken, nTok
23d50 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  en);..#ifdef SQL
23d60 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
23d70 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 54 45   If the QUERY_TE
23d80 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61  ST_NOIDX flag wa
23d90 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  s specified, the
23da0 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 61  n this must be a
23db0 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71  .    ** prefix-q
23dc0 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66  uery. Instead of
23dd0 20 75 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d   using a prefix-
23de0 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78  index (if one ex
23df0 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65  ists), .    ** e
23e00 76 61 6c 75 61 74 65 20 74 68 65 20 70 72 65 66  valuate the pref
23e10 69 78 20 71 75 65 72 79 20 75 73 69 6e 67 20 74  ix query using t
23e20 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65  he main FTS inde
23e30 78 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  x. This is used.
23e40 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72      ** for inter
23e50 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
23e60 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74 65 67  ing by the integ
23e70 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65  rity-check in de
23e80 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  bug .    ** mode
23e90 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69   only.  */.    i
23ea0 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65  f( pConfig->bPre
23eb0 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28  fixIndex==0 || (
23ec0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
23ed0 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
23ee0 44 58 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  DX) ){.      ass
23ef0 65 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53  ert( flags & FTS
23f00 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
23f10 46 49 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64  FIX );.      iId
23f20 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e  x = 1+pConfig->n
23f30 50 72 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73  Prefix;.    }els
23f40 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
23f50 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
23f60 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
23f70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68  ){.      int nCh
23f80 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  ar = fts5IndexCh
23f90 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  arlen(pToken, nT
23fa0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72  oken);.      for
23fb0 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70  (iIdx=1; iIdx<=p
23fc0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
23fd0 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20   iIdx++){.      
23fe0 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
23ff0 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d  Prefix[iIdx-1]==
24000 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20  nChar ) break;. 
24010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24020 20 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e    if( iIdx<=pCon
24030 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a  fig->nPrefix ){.
24040 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
24050 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66  ure *pStruct = f
24060 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
24070 28 70 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70  (p);.      buf.p
24080 5b 30 5d 20 3d 20 28 75 38 29 28 46 54 53 35 5f  [0] = (u8)(FTS5_
24090 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
240a0 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  dx);.      if( p
240b0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
240c0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
240d0 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31  ew(p, pStruct, 1
240e0 2c 20 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20  , flags, buf.p, 
240f0 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c  nToken+1, -1, 0,
24100 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20   &pRet);.       
24110 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24120 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
24140 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  e{.      int bDe
24150 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  sc = (flags & FT
24160 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
24170 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75  SC)!=0;.      bu
24180 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41  f.p[0] = FTS5_MA
24190 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20  IN_PREFIX;.     
241a0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
241b0 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62  Iter(p, bDesc, b
241c0 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
241d0 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b  pColset, &pRet);
241e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
241f0 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73  p->rc ){.      s
24200 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
24210 6f 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ose(pRet);.     
24220 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
24230 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
24240 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  (p);.    }.    *
24250 70 70 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20  ppIter = pRet;. 
24260 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
24270 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
24280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
24290 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
242a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
242b0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
242c0 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
242d0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
242e0 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
242f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24300 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
24310 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
24320 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
24330 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
24340 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
24350 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a   pIter->bEof;.}.
24360 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
24370 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
24380 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20   rowid. .*/.int 
24390 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
243a0 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65  ext(Fts5IndexIte
243b0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
243c0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
243d0 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
243e0 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69  K );.  fts5Multi
243f0 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
24400 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30  pIndex, pIter, 0
24410 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  , 0);.  return f
24420 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24430 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
24440 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
24450 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
24460 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73  g term/rowid. Us
24470 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f  ed by the fts5vo
24480 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69  cab module..*/.i
24490 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
244a0 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
244b0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
244c0 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
244d0 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
244e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
244f0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
24500 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
24510 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
24520 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
24530 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
24540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24550 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
24560 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
24570 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
24580 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
24590 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
245a0 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e  f && pSeg->term.
245b0 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f  p[0]!=FTS5_MAIN_
245c0 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
245d0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
245e0 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  pSeg->pLeaf);.  
245f0 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20      pSeg->pLeaf 
24600 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72  = 0;.      pIter
24610 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
24620 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24630 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
24640 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
24650 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
24660 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
24670 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63  ng rowid that oc
24680 63 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72  curs at or after
24690 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20   iMatch. The.** 
246a0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61  definition of "a
246b0 74 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65  t or after" depe
246c0 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74  nds on whether t
246d0 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65  his iterator ite
246e0 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65  rates.** in asce
246f0 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64  nding or descend
24700 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e  ing rowid order.
24710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
24720 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
24730 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
24740 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68  Iter, i64 iMatch
24750 29 7b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ){.  fts5MultiIt
24760 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72  erNextFrom(pIter
24770 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c  ->pIndex, pIter,
24780 20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75   iMatch);.  retu
24790 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
247a0 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
247b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
247c0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
247d0 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  owid..*/.i64 sql
247e0 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
247f0 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  d(Fts5IndexIter 
24800 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
24810 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  n fts5MultiIterR
24820 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 7d 0a 0a  owid(pIter);.}..
24830 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24840 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a   current term..*
24850 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
24860 6c 69 74 65 33 46 74 73 35 49 74 65 72 54 65 72  lite3Fts5IterTer
24870 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  m(Fts5IndexIter 
24880 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
24890 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  {.  int n;.  con
248a0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
248b0 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75  nst char*)fts5Mu
248c0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
248d0 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20  r, &n);.  *pn = 
248e0 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a  n-1;.  return &z
248f0 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  [1];.}...static 
24900 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74  int fts5IndexExt
24910 72 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46  ractColset (.  F
24920 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
24930 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
24940 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74  * Colset to filt
24950 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  er on */.  const
24960 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e   u8 *pPos, int n
24970 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f  Pos,       /* Po
24980 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
24990 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
249a0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
249b0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
249c0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
249d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
249e0 69 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75  int i;..  fts5Bu
249f0 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a  fferZero(pBuf);.
24a00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
24a10 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
24a20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
24a30 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20  pSub = pPos;.   
24a40 20 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35   int nSub = fts5
24a50 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
24a60 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f  &pSub, nPos, pCo
24a70 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b  lset->aiCol[i]);
24a80 0a 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b  .    if( nSub ){
24a90 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
24aa0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
24ab0 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75   pBuf, nSub, pSu
24ac0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
24ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
24ae0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
24af0 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
24b00 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  r containing a c
24b10 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
24b20 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20  ion list for.** 
24b30 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
24b40 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  y. Output variab
24b50 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f  le *pn is set to
24b60 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24b70 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62   buffer .** in b
24b80 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
24b90 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rning..**.** The
24ba0 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69   returned positi
24bb0 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  on list does not
24bc0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75   include the "nu
24bd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22 20 76  mber of bytes" v
24be0 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74  arint.** field t
24bf0 68 61 74 20 73 74 61 72 74 73 20 74 68 65 20 70  hat starts the p
24c00 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20  osition list on 
24c10 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
24c20 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
24c30 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
24c40 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
24c50 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
24c60 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
24c70 2f 2a 20 43 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  /* Column filter
24c80 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
24c90 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20  const u8 **pp,  
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
24cc0 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  to position-list
24cd0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
24ce0 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pn,             
24cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24d00 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74  T: Size of posit
24d10 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65  ion-list in byte
24d20 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f  s */.  i64 *piRo
24d30 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
24d40 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
24d50 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
24d60 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
24d70 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
24d80 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
24d90 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
24da0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
24db0 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
24dc0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
24dd0 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
24de0 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 70 53 65  Rowid;.  if( pSe
24df0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
24e00 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
24e10 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
24e20 7b 0a 20 20 20 20 75 38 20 2a 70 50 6f 73 20 3d  {.    u8 *pPos =
24e30 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70   &pSeg->pLeaf->p
24e40 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
24e50 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  et];.    if( pCo
24e60 6c 73 65 74 3d 3d 30 20 7c 7c 20 70 49 74 65 72  lset==0 || pIter
24e70 2d 3e 62 46 69 6c 74 65 72 65 64 20 29 7b 0a 20  ->bFiltered ){. 
24e80 20 20 20 20 20 2a 70 6e 20 3d 20 70 53 65 67 2d       *pn = pSeg-
24e90 3e 6e 50 6f 73 3b 0a 20 20 20 20 20 20 2a 70 70  >nPos;.      *pp
24ea0 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 7d 65 6c   = pPos;.    }el
24eb0 73 65 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e  se if( pColset->
24ec0 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nCol==1 ){.     
24ed0 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20 20   *pp = pPos;.   
24ee0 20 20 20 2a 70 6e 20 3d 20 66 74 73 35 49 6e 64     *pn = fts5Ind
24ef0 65 78 45 78 74 72 61 63 74 43 6f 6c 28 70 70 2c  exExtractCol(pp,
24f00 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f   pSeg->nPos, pCo
24f10 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
24f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24f30 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
24f40 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
24f50 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  );.      fts5Ind
24f60 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28  exExtractColset(
24f70 70 43 6f 6c 73 65 74 2c 20 70 50 6f 73 2c 20 70  pColset, pPos, p
24f80 53 65 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65  Seg->nPos, &pIte
24f90 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
24fa0 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e     *pp = pIter->
24fb0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 20  poslist.p;.     
24fc0 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pn = pIter->po
24fd0 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20  slist.n;.    }. 
24fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
24ff0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
25000 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
25010 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
25020 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
25030 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  x, pSeg, pColset
25040 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
25050 74 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  t);.    *pp = pI
25060 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
25070 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d      *pn = pIter-
25080 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a  >poslist.n;.  }.
25090 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
250a0 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
250b0 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
250c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
250d0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
250e0 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
250f0 6c 69 73 74 28 29 2c 20 65 78 63 65 70 74 20 74  list(), except t
25100 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73  hat it.** copies
25110 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
25120 73 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  st into the buff
25130 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  er supplied as t
25140 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
25150 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
25160 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
25170 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73 35  slistBuffer(Fts5
25180 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
25190 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
251a0 75 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  uf){.  Fts5Index
251b0 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
251c0 64 65 78 3b 0a 20 20 46 74 73 35 53 65 67 49 74  dex;.  Fts5SegIt
251d0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
251e0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
251f0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
25200 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   ];.  assert( p-
25210 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
25220 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  ;.  fts5BufferZe
25230 72 6f 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35  ro(pBuf);.  fts5
25240 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
25250 2c 20 70 53 65 67 2c 20 30 2c 20 70 42 75 66 29  , pSeg, 0, pBuf)
25260 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
25270 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
25280 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
25290 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64   iterator opened
252a0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
252b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
252c0 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
252d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
252e0 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
252f0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
25300 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
25310 29 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  ){.    Fts5Index
25320 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72   *pIndex = pIter
25330 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74  ->pIndex;.    ft
25340 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
25350 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
25360 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43  Iter);.    fts5C
25370 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65  loseReader(pInde
25380 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  x);.  }.}../*.**
25390 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65   Read and decode
253a0 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
253b0 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
253c0 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a  database. .**.**
253d0 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a   Parameter anSiz
253e0 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  e must point to 
253f0 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65  an array of size
25400 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f   nCol, where nCo
25410 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  l is.** the numb
25420 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e  er of user defin
25430 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
25440 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e FTS table..*/.
25450 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
25460 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
25470 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
25480 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61  4 *pnRow, i64 *a
25490 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43  nSize){.  int nC
254a0 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ol = p->pConfig-
254b0 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74  >nCol;.  Fts5Dat
254c0 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e  a *pData;..  *pn
254d0 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  Row = 0;.  memse
254e0 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a  t(anSize, 0, siz
254f0 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29  eof(i64) * nCol)
25500 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ;.  pData = fts5
25510 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
25520 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29  _AVERAGES_ROWID)
25530 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
25540 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
25550 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74  a->nn ){.    int
25560 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
25570 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66  iCol;.    i += f
25580 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
25590 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a  ata->p[i], (u64*
255a0 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72  )pnRow);.    for
255b0 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61  (iCol=0; i<pData
255c0 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f  ->nn && iCol<nCo
255d0 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
255e0 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
255f0 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
25600 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65  ], (u64*)&anSize
25610 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20  [iCol]);.    }. 
25620 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
25630 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20  lease(pData);.  
25640 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
25650 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
25660 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
25670 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65  current "average
25680 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74  s" record with t
25690 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
256a0 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75  he buffer .** su
256b0 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
256c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
256d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
256e0 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
256f0 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
25700 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
25710 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61   int nData){.  a
25720 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
25730 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
25740 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
25750 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
25760 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29  D, pData, nData)
25770 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
25780 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
25790 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
257a0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
257b0 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d  of blocks this m
257c0 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66  odule has read f
257d0 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a  rom the %_data.*
257e0 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74  * table since it
257f0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f   was created..*/
25800 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25810 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49  IndexReads(Fts5I
25820 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75  ndex *p){.  retu
25830 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a  rn p->nRead;.}..
25840 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32  /*.** Set the 32
25850 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75  -bit cookie valu
25860 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
25870 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72  start of all str
25880 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72  ucture .** recor
25890 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ds to the value 
258a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
258b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
258c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
258d0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
258e0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
258f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
25900 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
25910 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
25920 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f  e3Fts5IndexSetCo
25930 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a  okie(Fts5Index *
25940 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20  p, int iNew){.  
25950 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25970 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25980 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
25990 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
259a0 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a  ->pConfig;    /*
259b0 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
259c0 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43  bject */.  u8 aC
259d0 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20  ookie[4];       
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259f0 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73  /* Binary repres
25a00 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77  entation of iNew
25a10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
25a20 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a  ob *pBlob = 0;..
25a30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
25a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
25a50 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32  sqlite3Fts5Put32
25a60 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b  (aCookie, iNew);
25a70 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
25a80 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
25a90 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d  ig->db, pConfig-
25aa0 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
25ab0 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b  l, .      "block
25ac0 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  ", FTS5_STRUCTUR
25ad0 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c  E_ROWID, 1, &pBl
25ae0 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  ob.  );.  if( rc
25af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25b00 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
25b10 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f  write(pBlob, aCo
25b20 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20  okie, 4, 0);.   
25b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
25b40 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
25b50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
25b60 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
25b70 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f  3Fts5IndexLoadCo
25b80 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a  nfig(Fts5Index *
25b90 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
25ba0 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
25bb0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
25bc0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
25bd0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
25be0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
25bf0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
25c00 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
25c10 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
25c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
25c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ca0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
25cb0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
25cc0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
25cd0 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69  n of the integri
25ce0 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e  ty-check .** fun
25cf0 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a  ctionality..*/..
25d00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
25d10 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76  imple checksum v
25d20 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68  alue based on th
25d30 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  e arguments..*/.
25d40 73 74 61 74 69 63 20 75 36 34 20 66 74 73 35 49  static u64 fts5I
25d50 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a  ndexEntryCksum(.
25d60 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
25d70 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e   int iCol, .  in
25d80 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69  t iPos, .  int i
25d90 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
25da0 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20  r *pTerm,.  int 
25db0 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
25dc0 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
25dd0 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
25de0 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
25df0 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
25e00 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20  ) + iPos;.  if( 
25e10 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d  iIdx>=0 ) ret +=
25e20 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53   (ret<<3) + (FTS
25e30 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
25e40 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30  iIdx);.  for(i=0
25e50 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20  ; i<nTerm; i++) 
25e60 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
25e70 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65  + pTerm[i];.  re
25e80 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66  turn ret;.}..#if
25e90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
25ea0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25eb0 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61  tion is purely a
25ec0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
25ed0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
25ee0 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
25ef0 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
25f00 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
25f10 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
25f20 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
25f30 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73   Instead, it tes
25f40 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ts that the same
25f50 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77   set of pgno/row
25f60 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  id combinations 
25f70 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  are .** visited 
25f80 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
25f90 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73  ether the doclis
25fa0 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69  t-index identifi
25fb0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73  ed by parameters
25fc0 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66  .** iSegid/iLeaf
25fd0 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20   is iterated in 
25fe0 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65  forwards or reve
25ff0 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  rse order..*/.st
26000 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65  atic void fts5Te
26010 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a  stDlidxReverse(.
26020 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
26030 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20  .  int iSegid,  
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
26060 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f   to load from */
26070 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20  .  int iLeaf    
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69     /* Load docli
260a0 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69  st-index for thi
260b0 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46  s leaf */.){.  F
260c0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
260d0 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20  lidx = 0;.  u64 
260e0 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75  cksum1 = 13;.  u
260f0 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a  64 cksum2 = 13;.
26100 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
26110 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
26120 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 0, iSegid, iL
26130 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
26140 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
26150 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
26160 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
26170 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
26180 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
26190 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
261a0 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
261b0 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
261c0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
261d0 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
261e0 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61  ssert( pgno>iLea
261f0 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20  f );.    cksum1 
26200 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
26210 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
26220 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
26230 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
26240 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66  pDlidx = 0;..  f
26250 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
26260 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31  idxIterInit(p, 1
26270 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29  , iSegid, iLeaf)
26280 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
26290 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
262a0 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
262b0 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
262c0 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  p, pDlidx).  ){.
262d0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
262e0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
262f0 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  wid(pDlidx);.   
26300 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35   int pgno = fts5
26310 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
26320 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72  lidx);.    asser
26330 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
26340 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65  Pgno(pDlidx)>iLe
26350 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32  af );.    cksum2
26360 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
26370 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
26380 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
26390 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
263a0 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
263b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
263c0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d  E_OK && cksum1!=
263d0 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
263e0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d   FTS5_CORRUPT;.}
263f0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
26400 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46  5QueryCksum(.  F
26410 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26430 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a  * Fts5 index obj
26440 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
26450 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
26460 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *z,             
26470 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65       /* Index ke
26480 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  y to query for *
26490 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69      /* Size of i
264c0 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65  ndex key in byte
264d0 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  s */.  int flags
264e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
264f0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
26500 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65  for Fts5IndexQue
26510 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b  ry */.  u64 *pCk
26520 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  sum             
26530 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
26540 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  T: Checksum valu
26550 65 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b  e */.){.  u64 ck
26560 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  sum = *pCksum;. 
26570 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
26580 70 49 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20  pIdxIter = 0;.  
26590 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
265a0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70  Fts5IndexQuery(p
265b0 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30  , z, n, flags, 0
265c0 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20  , &pIdxIter);.. 
265d0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
265e0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
265f0 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
26600 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20  IdxIter) ){.    
26610 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 63  i64 dummy;.    c
26620 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a 20  onst u8 *pPos;. 
26630 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
26640 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c   i64 rowid = sql
26650 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
26660 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20  d(pIdxIter);.   
26670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
26680 35 49 74 65 72 50 6f 73 6c 69 73 74 28 70 49 64  5IterPoslist(pId
26690 78 49 74 65 72 2c 20 30 2c 20 26 70 50 6f 73 2c  xIter, 0, &pPos,
266a0 20 26 6e 50 6f 73 2c 20 26 64 75 6d 6d 79 29 3b   &nPos, &dummy);
266b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
266c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
266d0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
266e0 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20  r sReader;.     
266f0 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
26700 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
26710 74 28 70 50 6f 73 2c 20 6e 50 6f 73 2c 20 26 73  t(pPos, nPos, &s
26720 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20  Reader);.       
26730 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d     sReader.bEof=
26740 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  =0;.          sq
26750 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26760 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61  ReaderNext(&sRea
26770 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  der).      ){.  
26780 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
26790 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
267a0 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
267b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
267c0 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
267d0 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  ET(sReader.iPos)
267e0 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
267f0 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
26800 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43  yCksum(rowid, iC
26810 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20  ol, iOff, iIdx, 
26820 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
26830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26840 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49  3Fts5IterNext(pI
26850 64 78 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  dxIter);.    }. 
26860 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   }.  sqlite3Fts5
26870 49 74 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74  IterClose(pIdxIt
26880 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20  er);..  *pCksum 
26890 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72  = cksum;.  retur
268a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
268b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
268c0 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20   also purely an 
268d0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
268e0 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
268f0 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
26900 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
26910 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
26920 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
26930 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74  any way..*/.stat
26940 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
26950 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
26960 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66  x *p, .  Fts5Buf
26970 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20  fer *pPrev,     
26980 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
26990 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63  ious term */.  c
269a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
269b0 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  t n,           /
269c0 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74  * Possibly new t
269d0 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  erm to test */. 
269e0 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20   u64 expected,. 
269f0 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a   u64 *pCksum.){.
26a00 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
26a10 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e  ;.  if( pPrev->n
26a20 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  ==0 ){.    fts5B
26a30 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
26a40 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
26a50 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  8*)z);.  }else. 
26a60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26a70 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21  OK && (pPrev->n!
26a80 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72  =n || memcmp(pPr
26a90 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b  ev->p, z, n)) ){
26aa0 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20  .    u64 cksum3 
26ab0 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63  = *pCksum;.    c
26ac0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
26ad0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
26ae0 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f  &pPrev->p[1];  /
26af0 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66  * term sans pref
26b00 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ix-byte */.    i
26b10 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76  nt nTerm = pPrev
26b20 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20  ->n-1;          
26b30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
26b40 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
26b50 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70     int iIdx = (p
26b60 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53  Prev->p[0] - FTS
26b70 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a  5_MAIN_PREFIX);.
26b80 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
26b90 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46  (iIdx==0 ? 0 : F
26ba0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
26bb0 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20  REFIX);.    u64 
26bc0 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  ck1 = 0;.    u64
26bd0 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   ck2 = 0;..    /
26be0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
26bf0 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
26c00 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45  d for ASC and DE
26c10 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20  SC queries are. 
26c20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
26c30 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
26c40 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
26c50 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51  /.    rc = fts5Q
26c60 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
26c70 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
26c80 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
26c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
26cb0 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
26cc0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
26cd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
26ce0 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
26cf0 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
26d00 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
26d10 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
26d20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
26d30 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
26d40 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f  _CORRUPT;..    /
26d50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
26d60 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65  refix query, che
26d70 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
26d80 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20  lts returned if 
26d90 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  the.    ** the i
26da0 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
26db0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
26dc0 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
26dd0 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20  ESC order. .    
26de0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63  **.    ** This c
26df0 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65  heck may only be
26e00 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
26e10 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20  e hash table is 
26e20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20  empty. This.    
26e30 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68  ** is because th
26e40 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c  e hash table onl
26e50 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e  y supports a sin
26e60 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61  gle scan query a
26e70 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c  t.    ** a time,
26e80 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69   and the multi-i
26e90 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68  ter loop from wh
26ea0 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ich this functio
26eb0 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  n is called.    
26ec0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65  ** is already pe
26ed0 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20  rforming such a 
26ee0 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
26ef0 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
26f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
26f10 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
26f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26f30 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
26f40 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
26f50 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20  Y_TEST_NOIDX;.  
26f60 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
26f70 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
26f80 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
26f90 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
26fa0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
26fb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26fc0 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
26fd0 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
26fe0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
26ff0 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
27000 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
27010 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
27020 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
27030 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
27040 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51  OIDX|FTS5INDEX_Q
27050 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
27060 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
27070 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
27080 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
27090 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
270a0 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20  , &ck2);.       
270b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
270c0 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
270d0 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
270e0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
270f0 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d  }..    cksum3 ^=
27100 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75   ck1;.    fts5Bu
27110 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
27120 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
27130 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  *)z);..    if( r
27140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27150 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64  cksum3!=expected
27160 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
27170 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
27180 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d   }.    *pCksum =
27190 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70   cksum3;.  }.  p
271a0 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23  ->rc = rc;.}. .#
271b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
271c0 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
271d0 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69  se(x,y,z).# defi
271e0 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  ne fts5TestTerm(
271f0 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
27200 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
27210 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31   that:.**.**   1
27220 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
27230 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69  pSeg between iFi
27240 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69  rst and iLast (i
27250 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
27260 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
27270 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a  ain zero terms..
27280 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76  **   2) All leav
27290 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
272a0 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20  en iNoRowid and 
272b0 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
272c0 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
272d0 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
272e0 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
272f0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
27300 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
27310 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65  mpty(.  Fts5Inde
27320 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75  x *p,.  Fts5Stru
27330 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
27340 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg,     /* Segme
27350 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
27360 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
27370 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
27380 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64  ,.  int iNoRowid
27390 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b  ,.  int iLast.){
273a0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
273b0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
273c0 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
273d0 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
273e0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
273f0 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20  .  ** (a) exist 
27400 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
27410 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66  no terms. */.  f
27420 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e  or(i=iFirst; p->
27430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27440 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b   i<=iLast; i++){
27450 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
27460 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
27470 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
27480 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
27490 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20  iSegid, i));.   
274a0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
274b0 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61      if( !fts5Lea
274c0 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61  fIsTermless(pLea
274d0 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
274e0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
274f0 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64   if( i>=iNoRowid
27500 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46   && 0!=fts5LeafF
27510 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
27520 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
27530 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
27540 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
27550 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
27560 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
27570 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
27580 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64  eckPgidx(Fts5Ind
27590 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20  ex *p, Fts5Data 
275a0 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69  *pLeaf){.  int i
275b0 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69  TermOff = 0;.  i
275c0 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75  nt ii;..  Fts5Bu
275d0 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30  ffer buf1 = {0,0
275e0 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ,0};.  Fts5Buffe
275f0 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d  r buf2 = {0,0,0}
27600 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d  ;..  ii = pLeaf-
27610 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65  >szLeaf;.  while
27620 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26  ( ii<pLeaf->nn &
27630 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
27640 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  OK ){.    int re
27650 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  s;.    int iOff;
27660 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a  .    int nIncr;.
27670 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47  .    ii += fts5G
27680 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
27690 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29  f->p[ii], nIncr)
276a0 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
276b0 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66  = nIncr;.    iOf
276c0 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
276d0 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
276e0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
276f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
27700 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
27710 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
27720 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20  ==nIncr ){.     
27730 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
27740 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
27750 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
27760 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
27770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f  );.      if( (iO
27780 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
27790 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
277a0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
277b0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
277c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
277d0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
277e0 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
277f0 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
27800 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
27810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
27820 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20   nKeep, nByte;. 
27830 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
27840 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
27850 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b  eaf->p[iOff], nK
27860 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  eep);.      iOff
27870 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
27880 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
27890 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
278a0 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66     if( nKeep>buf
278b0 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79  1.n || (iOff+nBy
278c0 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
278d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
278e0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
278f0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
27900 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d          buf1.n =
27910 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
27920 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
27930 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
27940 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
27950 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
27960 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
27970 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27980 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
27990 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
279a0 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32  are(&buf1, &buf2
279b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
279c0 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  es<=0 ) p->rc = 
279d0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
279e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
279f0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
27a00 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66  ->rc, &buf2, buf
27a10 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20  1.n, buf1.p);.  
27a20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  }..  fts5BufferF
27a30 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74  ree(&buf1);.  ft
27a40 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
27a50 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  f2);.}..static v
27a60 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
27a70 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
27a80 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
27a90 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
27aa0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
27ab0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
27ac0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
27ad0 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20  egment *pSeg    
27ae0 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
27af0 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
27b00 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b  onsistency */.){
27b10 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
27b20 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
27b30 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  fig;.  sqlite3_s
27b40 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
27b50 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74    int rc2;.  int
27b60 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
27b70 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
27b80 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50  1;.  int iDlidxP
27b90 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
27ba0 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28  pgnoLast;..  if(
27bb0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
27bc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
27bd0 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
27be0 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c  eStmt(p, &pStmt,
27bf0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27c00 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  (.      "SELECT 
27c10 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67  segid, term, (pg
27c20 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29  no>>1), (pgno&1)
27c30 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78   FROM %Q.'%q_idx
27c40 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64  ' WHERE segid=%d
27c50 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ",.      pConfig
27c60 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
27c70 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65  zName, pSeg->iSe
27c80 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  gid.  ));..  /* 
27c90 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
27ca0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
27cb0 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c  rchy.  */.  whil
27cc0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
27cd0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
27ce0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
27cf0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36  pStmt) ){.    i6
27d00 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
27d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27d20 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65  owid for this le
27d30 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  af */.    Fts5Da
27d40 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
27d50 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
27d60 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
27d70 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65  ..    int nIdxTe
27d80 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rm = sqlite3_col
27d90 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
27da0 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
27db0 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20  har *zIdxTerm = 
27dc0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
27dd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
27de0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
27df0 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73  int iIdxLeaf = s
27e00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
27e10 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
27e20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d   int bIdxDlidx =
27e30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27e40 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a  int(pStmt, 3);..
27e50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
27e60 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
27e70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
27e80 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
27e90 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
27ea0 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
27eb0 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
27ec0 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
27ed0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
27ee0 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c     if( iIdxLeaf<
27ef0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
27f00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27f10 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
27f20 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
27f30 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
27f40 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
27f50 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
27f60 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
27f70 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
27f80 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
27f90 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
27fa0 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
27fb0 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
27fc0 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
27fd0 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
27fe0 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
27ff0 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e  key in zIdxTerm.
28000 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61    Also check tha
28010 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a  t if there.    *
28020 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69  * is also a rowi
28030 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  d pointer within
28040 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68   the leaf page h
28050 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73  eader, it points
28060 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63   to a.    ** loc
28070 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65  ation before the
28080 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69   term.  */.    i
28090 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c  f( pLeaf->nn<=pL
280a0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
280b0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
280c0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
280d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
280e0 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
280f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
28100 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
28110 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
28120 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20   int iRowidOff; 
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28140 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
28150 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f  rowid on leaf */
28160 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
28170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28180 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
28190 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79  rm on leaf in by
281a0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tes */.      int
281b0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
281c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
281d0 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61  arison of term a
281e0 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a  nd split-key */.
281f0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
28200 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
28210 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
28220 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
28230 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
28240 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
28250 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
28260 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  iOff ){.        
28270 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
28280 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
28290 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
282a0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
282b0 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
282c0 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  f], nTerm);.    
282d0 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
282e0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
282f0 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28  , zIdxTerm, MIN(
28300 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29  nTerm, nIdxTerm)
28310 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28320 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54  es==0 ) res = nT
28330 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a  erm - nIdxTerm;.
28340 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
28350 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
28360 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
28370 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74  }..      fts5Int
28380 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
28390 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  (p, pLeaf);.    
283a0 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
283b0 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
283c0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
283d0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  eak;..    /* Now
283e0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
283f0 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76  iter.nEmpty leav
28400 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  es following the
28410 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20   current leaf.  
28420 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
28430 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
28440 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20  o terms. */.    
28450 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
28460 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
28470 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69        p, pSeg, i
28480 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69  IdxPrevLeaf+1, i
28490 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c  DlidxPrevLeaf+1,
284a0 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20   iIdxLeaf-1.    
284b0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
284c0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
284d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
284e0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63  doclist-index, c
284f0 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f  heck that it loo
28500 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ks right. */.   
28510 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29   if( bIdxDlidx )
28520 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
28530 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
28540 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61  0;  /* For itera
28550 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63  ting through doc
28560 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
28570 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61      int iPrevLea
28580 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
28590 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
285a0 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20   pSeg->iSegid;. 
285b0 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30       int iPg = 0
285c0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79  ;.      i64 iKey
285d0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c  ;..      for(pDl
285e0 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
285f0 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
28600 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
28610 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
28620 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
28630 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
28640 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
28650 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
28660 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20        ){..      
28670 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72    /* Check any r
28680 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20  owid-less pages 
28690 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
286a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  e the current le
286b0 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  af. */.        f
286c0 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66  or(iPg=iPrevLeaf
286d0 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64  +1; iPg<fts5Dlid
286e0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
286f0 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
28700 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35       iKey = FTS5
28710 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
28720 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20  Segid, iPg);.   
28730 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
28740 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
28750 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
28760 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
28770 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
28780 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
28790 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70  ff(pLeaf)!=0 ) p
287a0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
287b0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UPT;.           
287c0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
287d0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
287e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
287f0 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66         iPrevLeaf
28800 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
28810 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
28820 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
28830 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
28840 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
28850 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
28860 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
28870 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
28880 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
28890 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
288a0 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
288b0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
288c0 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c  D(iSegid, iPrevL
288d0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  eaf);.        pL
288e0 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
288f0 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
28900 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
28910 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
28920 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
28930 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
28940 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
28950 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
28960 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54            ASSERT
28970 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66  _SZLEAF_OK(pLeaf
28980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28990 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61   iRowidOff>=pLea
289a0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
289b0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
289c0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
289d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
289e0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
289f0 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
28a00 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20  ->p[iRowidOff], 
28a10 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
28a20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28a30 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64  iRowid!=fts5Dlid
28a40 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
28a50 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  x) ) p->rc = FTS
28a60 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
28a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28a80 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
28a90 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
28aa0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
28ab0 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
28ac0 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74   = iPg;.      ft
28ad0 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
28ae0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
28af0 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
28b00 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69  rse(p, iSegid, i
28b10 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65  IdxLeaf);.    }e
28b20 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64  lse{.      iDlid
28b30 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
28b40 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  ->pgnoLast;.    
28b50 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
28b60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63   there is no doc
28b70 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
28b80 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65    }..    iIdxPre
28b90 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66  vLeaf = iIdxLeaf
28ba0 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73  ;.  }..  rc2 = s
28bb0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
28bc0 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d  pStmt);.  if( p-
28bd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
28be0 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20   p->rc = rc2;.. 
28bf0 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c   /* Page iter.iL
28c00 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20  eaf must now be 
28c10 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65  the rightmost le
28c20 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73  af-page in the s
28c30 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a  egment */.#if 0.
28c40 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
28c50 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69  ITE_OK && iter.i
28c60 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f  Leaf!=pSeg->pgno
28c70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
28c80 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
28c90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
28ca0 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72  ./*.** Run inter
28cb0 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e  nal checks to en
28cc0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54  sure that the FT
28cd0 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69  S index (a) is i
28ce0 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f  nternally .** co
28cf0 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29  nsistent and (b)
28d00 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
28d10 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
28d20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b  XOR of the check
28d30 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75  sums.** as calcu
28d40 6c 61 74 65 64 20 62 79 20 66 74 73 35 49 6e 64  lated by fts5Ind
28d50 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69  exEntryCksum() i
28d60 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52  s cksum..**.** R
28d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28d80 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74  RUPT if any of t
28d90 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  he internal chec
28da0 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74  ks fail, or if t
28db0 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64  he.** checksum d
28dc0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52  oes not match. R
28dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
28de0 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61  if all checks pa
28df0 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72  ss without.** er
28e00 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ror, or some oth
28e10 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  er SQLite error 
28e20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20  code if another 
28e30 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29  error (e.g. OOM)
28e40 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
28e50 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28e60 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
28e70 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  k(Fts5Index *p, 
28e80 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 75 36  u64 cksum){.  u6
28e90 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20  4 cksum2 = 0;   
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28eb0 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
28ec0 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
28ed0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
28ee0 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d  Buffer poslist =
28ef0 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42   {0,0,0};   /* B
28f00 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
28f10 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  ld a poslist */.
28f20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
28f30 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
28f40 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
28f50 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74  rate through ent
28f60 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46  ire index */.  F
28f70 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
28f80 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f  truct;         /
28f90 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
28fa0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
28fb0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55  ITE_DEBUG.  /* U
28fc0 73 65 64 20 62 79 20 65 78 74 72 61 20 69 6e 74  sed by extra int
28fd0 65 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79  ernal tests only
28fe0 20 72 75 6e 20 69 66 20 4e 44 45 42 55 47 20 69   run if NDEBUG i
28ff0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f  s not defined */
29000 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20  .  u64 cksum3 = 
29010 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29020 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
29030 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73  ased on contents
29040 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20   of indexes */. 
29050 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
29060 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20   = {0,0,0};     
29070 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
29080 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63  to hold most rec
29090 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 23 65 6e 64  ent term */.#end
290a0 69 66 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20  if.  .  /* Load 
290b0 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
290c0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 53 74  ructure */.  pSt
290d0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
290e0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20  tureRead(p);..  
290f0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
29100 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
29110 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74   of each segment
29120 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76 65   match the leave
29130 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75  s */.  if( pStru
29140 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ct ){.    int iL
29150 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 66 6f  vl, iSeg;.    fo
29160 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
29170 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
29180 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66  iLvl++){.      f
29190 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
291a0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
291b0 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
291c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ++){.        Fts
291d0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
291e0 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75  t *pSeg = &pStru
291f0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
29200 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
29210 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e       fts5IndexIn
29220 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
29230 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20  ent(p, pSeg);.  
29240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
29250 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20  .  /* The cksum 
29260 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
29270 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
29280 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d 20 63   is a checksum c
29290 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62  alculated.  ** b
292a0 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65  ased on all expe
292b0 63 74 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20  cted entries in 
292c0 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 69  the FTS index (i
292d0 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69 78 20  ncluding prefix 
292e0 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69  index.  ** entri
292f0 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  es). This block 
29300 63 68 65 63 6b 73 20 74 68 61 74 20 61 20 63 68  checks that a ch
29310 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65  ecksum calculate
29320 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20  d based on the. 
29330 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65   ** actual conte
29340 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64 65 78  nts of FTS index
29350 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20   is identical.. 
29360 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72   **.  ** Two ver
29370 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d  sions of the sam
29380 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65 20 63  e checksum are c
29390 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65 20 66  alculated. The f
293a0 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a  irst (stack.  **
293b0 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75 6d 32   variable cksum2
293c0 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74 72 69  ) based on entri
293d0 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
293e0 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  m the full-text 
293f0 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65  index.  ** while
29400 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72 20   doing a linear 
29410 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69 6e 64  scan of each ind
29420 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20 69 6e  ividual index in
29430 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a   turn. .  **.  *
29440 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d 20 76  * As each term v
29450 69 73 69 74 65 64 20 62 79 20 74 68 65 20 6c 69  isited by the li
29460 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20 73 65  near scans, a se
29470 70 61 72 61 74 65 20 71 75 65 72 79 20 66 6f 72  parate query for
29480 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74   the.  ** same t
29490 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d 65 64  erm is performed
294a0 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61 6c 63  . cksum3 is calc
294b0 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
294c0 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  the entries.  **
294d0 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
294e0 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20 20 2a  ese queries..  *
294f0 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74  /.  for(fts5Mult
29500 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
29510 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  uct, 0, 0, 0, 0,
29520 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b   -1, 0, &pIter);
29530 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
29540 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
29550 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
29560 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
29570 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
29580 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  ){.    int n;   
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
295b0 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
295c0 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b     i64 iPos = 0;
295d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
295e0 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20  * Position read 
295f0 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  from poslist */.
29600 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
29610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29620 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e  /* Offset within
29630 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20   poslist */.    
29640 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
29650 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
29660 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72  pIter);.    char
29670 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73   *z = (char*)fts
29680 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
29690 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20  Iter, &n);..    
296a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
296b0 6e 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20  new term, query 
296c0 66 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20 63  for it. Update c
296d0 6b 73 75 6d 33 20 77 69 74 68 20 74 68 65 20 72  ksum3 with the r
296e0 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66  esults. */.    f
296f0 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26  ts5TestTerm(p, &
29700 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75  term, z, n, cksu
29710 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20  m2, &cksum3);.. 
29720 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30     poslist.n = 0
29730 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
29740 72 50 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74  rPoslist(p, &pIt
29750 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
29760 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
29770 5d 20 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29  ] , 0, &poslist)
29780 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d  ;.    while( 0==
29790 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
297a0 73 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74  stNext64(poslist
297b0 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26  .p, poslist.n, &
297c0 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a  iOff, &iPos) ){.
297d0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
297e0 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
297f0 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 6e  (iPos);.      in
29800 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35  t iTokOff = FTS5
29810 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73  _POS2OFFSET(iPos
29820 29 3b 0a 20 20 20 20 20 20 63 6b 73 75 6d 32 20  );.      cksum2 
29830 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
29840 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
29850 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31  Col, iTokOff, -1
29860 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , z, n);.    }. 
29870 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72   }.  fts5TestTer
29880 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30  m(p, &term, 0, 0
29890 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
298a0 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69  3);..  fts5Multi
298b0 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65  IterFree(p, pIte
298c0 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r);.  if( p->rc=
298d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
298e0 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  sum!=cksum2 ) p-
298f0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
29900 50 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63  PT;..  fts5Struc
29910 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
29920 75 63 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  uct);.#ifdef SQL
29930 49 54 45 5f 44 45 42 55 47 0a 20 20 66 74 73 35  ITE_DEBUG.  fts5
29940 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
29950 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 74 73 35  );.#endif.  fts5
29960 42 75 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c  BufferFree(&posl
29970 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ist);.  return f
29980 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
29990 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  );.}.../*.** Cal
299a0 63 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72  culate and retur
299b0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61  n a checksum tha
299c0 74 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20  t is the XOR of 
299d0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
299e0 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61  ** checksum of a
299f0 6c 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ll entries that 
29a00 77 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  would be generat
29a10 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20  ed by the token 
29a20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
29a30 74 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75  the final 5 argu
29a40 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71  ments..*/.u64 sq
29a50 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b  lite3Fts5IndexCk
29a60 73 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  sum(.  Fts5Confi
29a70 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
29a80 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
29a90 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  uration object *
29aa0 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  /.  i64 iRowid, 
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20      /* Document 
29ad0 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
29ae0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b00 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
29b10 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
29b20 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b40 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
29b50 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
29b60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
29b70 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
29b80 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20  m    /* Term at 
29b90 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  iPos */.){.  u64
29ba0 20 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20   ret = 0;       
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29bc0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
29bd0 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
29c00 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  ng through index
29c10 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66  es */..  ret = f
29c20 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
29c30 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
29c40 20 69 50 6f 73 2c 20 30 2c 20 70 54 65 72 6d 2c   iPos, 0, pTerm,
29c50 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28   nTerm);..  for(
29c60 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f  iIdx=0; iIdx<pCo
29c70 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
29c80 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  Idx++){.    int 
29c90 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64 65  nByte = fts5Inde
29ca0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
29cb0 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  n(pTerm, nTerm, 
29cc0 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
29cd0 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28  [iIdx]);.    if(
29ce0 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
29cf0 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  ret ^= fts5Index
29d00 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
29d10 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 69  d, iCol, iPos, i
29d20 49 64 78 2b 31 2c 20 70 54 65 72 6d 2c 20 6e 42  Idx+1, pTerm, nB
29d30 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  yte);.    }.  }.
29d40 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
29d50 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
29d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
29da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29de0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
29df0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
29e00 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
29e10 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  n of the fts5_de
29e20 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a  code() scalar.**
29e30 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a   function only..
29e40 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  */../*.** Decode
29e50 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20   a segment-data 
29e60 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25  rowid from the %
29e70 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69  _data table. Thi
29e80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
29e90 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66   the opposite of
29ea0 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d   macro FTS5_SEGM
29eb0 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a  ENT_ROWID()..*/.
29ec0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
29ed0 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69  DecodeRowid(.  i
29ee0 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f00 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64  * Rowid from %_d
29f10 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ata table */.  i
29f20 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20  nt *piSegid,    
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f40 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69  * OUT: Segment i
29f50 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c  d */.  int *pbDl
29f60 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
29f70 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
29f80 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69  lidx flag */.  i
29f90 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20  nt *piHeight,   
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29fb0 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f  * OUT: Height */
29fc0 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20  .  int *piPgno  
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20     /* OUT: Page 
29ff0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a  number */.){.  *
2a000 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69  piPgno = (int)(i
2a010 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2a020 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   << FTS5_DATA_PA
2a030 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  GE_B) - 1));.  i
2a040 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2a050 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a  ATA_PAGE_B;..  *
2a060 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29  piHeight = (int)
2a070 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2a080 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2a090 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b  HEIGHT_B) - 1));
2a0a0 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2a0b0 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2a0c0 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20  ;..  *pbDlidx = 
2a0d0 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30  (int)(iRowid & 0
2a0e0 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64  x0001);.  iRowid
2a0f0 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44   >>= FTS5_DATA_D
2a100 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69  LI_B;..  *piSegi
2a110 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  d = (int)(iRowid
2a120 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2a130 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
2a140 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   1));.}..static 
2a150 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f  void fts5DebugRo
2a160 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  wid(int *pRc, Ft
2a170 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2a180 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74  i64 iKey){.  int
2a190 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
2a1a0 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b  , iPgno, bDlidx;
2a1b0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2a1c0 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20  compenents */.  
2a1d0 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2a1e0 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26  iKey, &iSegid, &
2a1f0 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74  bDlidx, &iHeight
2a200 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66  , &iPgno);..  if
2a210 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2a220 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53     if( iKey==FTS
2a230 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2a240 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a250 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2a260 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2a270 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22  f, "{averages} "
2a280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a290 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2a2a0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2a2b0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73  f(pRc, pBuf, "{s
2a2c0 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20  tructure}");.   
2a2d0 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20   }.  }.  else{. 
2a2e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2a2f0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2a300 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73  (pRc, pBuf, "{%s
2a310 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67  segid=%d h=%d pg
2a320 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  no=%d}",.       
2a330 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78   bDlidx ? "dlidx
2a340 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c   " : "", iSegid,
2a350 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a   iHeight, iPgno.
2a360 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74      );.  }.}..st
2a370 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2a380 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20  bugStructure(.  
2a390 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3b0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2a3c0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2a3d0 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46  uffer *pBuf,.  F
2a3e0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a  ts5Structure *p.
2a3f0 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  ){.  int iLvl, i
2a400 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
2a410 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
2a420 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20  through levels, 
2a430 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66  segments */..  f
2a440 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
2a450 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  p->nLevel; iLvl+
2a460 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  +){.    Fts5Stru
2a470 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
2a480 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c   = &p->aLevel[iL
2a490 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  vl];.    sqlite3
2a4a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2a4b0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2a4c0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76  , .        " {lv
2a4d0 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e  l=%d nMerge=%d n
2a4e0 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  Seg=%d", iLvl, p
2a4f0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76  Lvl->nMerge, pLv
2a500 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20  l->nSeg.    );. 
2a510 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2a520 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
2a530 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iSeg++){.      F
2a540 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2a550 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
2a560 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
2a570 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2a580 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2a590 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2a5a0 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64  {id=%d leaves=%d
2a5b0 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20  ..%d}", .       
2a5c0 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c     pSeg->iSegid,
2a5d0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2a5e0 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
2a5f0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2a600 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2a610 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2a620 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22  f(pRc, pBuf, "}"
2a630 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2a640 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2a650 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2a660 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2a670 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2a680 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2a690 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65  tain a serialize
2a6a0 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  d Fts5Structure 
2a6b0 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20  object. This.** 
2a6c0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2a6d0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2a6e0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2a6f0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a   of the same obj
2a700 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75  ect.** to the bu
2a710 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
2a720 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a730 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
2a740 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74  oid fts5DecodeSt
2a750 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
2a760 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2a770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2a780 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2a790 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2a7a0 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2a7b0 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2a7c0 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Blob.){.  int rc
2a7d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a7f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
2a800 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d  s5Structure *p =
2a810 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2a820 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75   Decoded structu
2a830 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  re object */..  
2a840 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
2a850 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20  reDecode(pBlob, 
2a860 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20  nBlob, 0, &p);. 
2a870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a880 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
2a890 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2a8a0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75  .  }..  fts5Debu
2a8b0 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20  gStructure(pRc, 
2a8c0 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35  pBuf, p);.  fts5
2a8d0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2a8e0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
2a8f0 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2a900 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2a910 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2a920 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2a930 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2a940 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22  in an "averages"
2a950 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75   record. This fu
2a960 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e  nction .** appen
2a970 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2a980 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2a990 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  on of record to 
2a9a0 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
2a9b0 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  d .** as the sec
2a9c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2a9d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2a9e0 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73  s5DecodeAverages
2a9f0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa10 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2aa20 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2aa30 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2aa40 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
2aa50 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
2aa60 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
2aa70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
2aa80 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c  ce = "";..  whil
2aa90 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20  e( i<nBlob ){.  
2aaa0 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
2aab0 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
2aac0 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62  GetVarint(&pBlob
2aad0 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
2aae0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2aaf0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2ab00 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22  Rc, pBuf, "%s%d"
2ab10 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69  , zSpace, (int)i
2ab20 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65  Val);.    zSpace
2ab30 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = " ";.  }.}../
2ab40 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e  *.** Buffer (a/n
2ab50 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
2ab60 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f  contain a list o
2ab70 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72  f serialized var
2ab80 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61  ints. Read.** ea
2ab90 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  ch varint and ap
2aba0 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20  pend its string 
2abb0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74  representation t
2abc0 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52  o buffer pBuf. R
2abd0 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65  eturn.** after e
2abe0 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20  ither the input 
2abf0 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
2ac00 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65  ted or a 0 value
2ac10 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
2ac20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2ac30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2ac40 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2ac50 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2ac60 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2ac70 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  t fts5DecodePosl
2ac80 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2ac90 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2aca0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2acb0 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20   n){.  int iOff 
2acc0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  = 0;.  while( iO
2acd0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
2ace0 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  iVal;.    iOff +
2acf0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2ad00 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c  2(&a[iOff], iVal
2ad10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2ad20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2ad30 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2ad40 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20  " %d", iVal);.  
2ad50 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  }.  return iOff;
2ad60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
2ad70 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61  art of buffer (a
2ad80 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  /n) contains the
2ad90 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c   start of a docl
2ada0 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ist. The doclist
2adb0 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  .** may or may n
2adc0 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e  ot finish within
2add0 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69   the buffer. Thi
2ade0 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
2adf0 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70  ds a text.** rep
2ae00 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2ae10 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  he part of the d
2ae20 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70  oclist that is p
2ae30 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72  resent to buffer
2ae40 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a  .** pBuf. .**.**
2ae50 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2ae60 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2ae70 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
2ae80 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
2ae90 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
2aea0 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  nt fts5DecodeDoc
2aeb0 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
2aec0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2aed0 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
2aee0 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63  t n){.  i64 iDoc
2aef0 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  id = 0;.  int iO
2af00 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e  ff = 0;..  if( n
2af10 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d  >0 ){.    iOff =
2af20 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
2af30 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
2af40 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c  iDocid);.    sql
2af50 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2af60 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2af70 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2af80 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
2af90 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2afa0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
2afb0 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20      int bDel;.  
2afc0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2afd0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
2afe0 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
2aff0 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Del);.    sqlite
2b000 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2b010 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2b020 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c  f, " nPos=%d%s",
2b030 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a   nPos, bDel?"*":
2b040 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  "");.    iOff +=
2b050 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2b060 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
2b070 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
2b080 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
2b090 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
2b0a0 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
2b0b0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
2b0c0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2b0d0 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
2b0e0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
2b0f0 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65     iDocid += iDe
2b100 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
2b110 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2b120 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2b130 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2b140 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iDocid);.    }. 
2b150 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66   }..  return iOf
2b160 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
2b170 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2b180 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
2b190 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
2b1a0 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f  ts5_decode()..*/
2b1b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2b1c0 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28  5DecodeFunction(
2b1d0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2b1e0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
2b1f0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
2b200 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
2b210 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2b240 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
2b250 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2b260 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
2b270 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
2b280 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2b290 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2b0 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65   /* Rowid for re
2b2c0 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64  cord being decod
2b2d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  ed */.  int iSeg
2b2e0 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f  id,iHeight,iPgno
2b2f0 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64  ,bDlidx;/* Rowid
2b300 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20   components */. 
2b310 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62   const u8 *aBlob
2b320 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20  ; int n;        
2b330 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65   /* Record to de
2b340 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20  code */.  u8 *a 
2b350 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65  = 0;.  Fts5Buffe
2b360 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  r s;            
2b370 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20         /* Build 
2b380 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72  up text to retur
2b390 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
2b3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b3c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2b3d0 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a  int nSpace = 0;.
2b3e0 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d  .  assert( nArg=
2b3f0 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =2 );.  memset(&
2b400 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
2b410 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f  5Buffer));.  iRo
2b420 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
2b430 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
2b440 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0]);..  /* Make 
2b450 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
2b460 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61  cond argument (a
2b470 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b   blob) in aBlob[
2b480 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20  ]. The aBlob[]. 
2b490 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c   ** copy is foll
2b4a0 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54  owed by FTS5_DAT
2b4b0 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30  A_ZERO_PADDING 0
2b4c0 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68  x00 bytes, which
2b4d0 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62   prevents.  ** b
2b4e0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20  uffer overreads 
2b4f0 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f  even if the reco
2b500 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  rd is corrupt.  
2b510 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  */.  n = sqlite3
2b520 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
2b530 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20  al[1]);.  aBlob 
2b540 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2b550 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  blob(apVal[1]);.
2b560 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46    nSpace = n + F
2b570 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
2b580 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38  DDING;.  a = (u8
2b590 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
2b5a0 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70  locZero(&rc, nSp
2b5b0 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30  ace);.  if( a==0
2b5c0 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f   ) goto decode_o
2b5d0 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20  ut;.  memcpy(a, 
2b5e0 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66  aBlob, n);...  f
2b5f0 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
2b600 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c 20  Rowid, &iSegid, 
2b610 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
2b620 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66  t, &iPgno);..  f
2b630 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72  ts5DebugRowid(&r
2b640 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a  c, &s, iRowid);.
2b650 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a    if( bDlidx ){.
2b660 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69      Fts5Data dli
2b670 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  dx;.    Fts5Dlid
2b680 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64  xLvl lvl;..    d
2b690 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20  lidx.p = a;.    
2b6a0 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20  dlidx.nn = n;.. 
2b6b0 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20     memset(&lvl, 
2b6c0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
2b6d0 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76  idxLvl));.    lv
2b6e0 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64 78  l.pData = &dlidx
2b6f0 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50  ;.    lvl.iLeafP
2b700 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20  gno = iPgno;..  
2b710 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 4c    for(fts5DlidxL
2b720 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76  vlNext(&lvl); lv
2b730 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44  l.bEof==0; fts5D
2b740 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c  lidxLvlNext(&lvl
2b750 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )){.      sqlite
2b760 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2b770 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
2b780 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64   .          " %d
2b790 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65  (%lld)", lvl.iLe
2b7a0 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77  afPgno, lvl.iRow
2b7b0 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
2b7c0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53  }.  }else if( iS
2b7d0 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egid==0 ){.    i
2b7e0 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f  f( iRowid==FTS5_
2b7f0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
2b800 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  {.      fts5Deco
2b810 64 65 41 76 65 72 61 67 65 73 28 26 72 63 2c 20  deAverages(&rc, 
2b820 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
2b830 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
2b840 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
2b850 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
2b860 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b870 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65     Fts5Buffer te
2b880 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2b890 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d   /* Current term
2b8a0 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20   read from page 
2b8b0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61  */.    int szLea
2b8c0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2b8d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
2b8e0 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a  f pgidx in a[] *
2b8f0 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78  /.    int iPgidx
2b900 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  Off;.    int iPg
2b910 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20 20  idxPrev = 0;    
2b920 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
2b930 75 73 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  us value read fr
2b940 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20 20  om pgidx */.    
2b950 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
2b960 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64  ;.    int iRowid
2b970 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
2b980 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e   iOff;.    int n
2b990 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65  Doclist;..    me
2b9a0 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
2b9b0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
2b9c0 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34  ));..    if( n<4
2b9d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b9e0 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
2b9f0 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73  rc, &s, 7, (cons
2ba00 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29  t u8*)"corrupt")
2ba10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63  ;.      goto dec
2ba20 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c  ode_out;.    }el
2ba30 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  se{.      iRowid
2ba40 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
2ba50 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[0]);.      i
2ba60 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61  PgidxOff = szLea
2ba70 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
2ba80 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[2]);.      if(
2ba90 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
2baa0 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2bab0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
2bac0 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29  xOff], iTermOff)
2bad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bae0 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
2baf0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
2bb00 20 74 61 69 6c 20 61 74 20 74 68 65 20 73 74 61   tail at the sta
2bb10 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
2bb20 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
2bb30 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off!=0 ){.      
2bb40 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66  iOff = iRowidOff
2bb50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2bb60 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20  iTermOff!=0 ){. 
2bb70 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
2bb80 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mOff;.    }else{
2bb90 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73 7a  .      iOff = sz
2bba0 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Leaf;.    }.    
2bbb0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2bbc0 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d  t(&rc, &s, &a[4]
2bbd0 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20  , iOff-4);..    
2bbe0 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f  /* Decode any mo
2bbf0 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61 20  re doclist data 
2bc00 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
2bc10 74 68 65 20 70 61 67 65 20 62 65 66 6f 72 65 20  the page before 
2bc20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
2bc30 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44   term. */.    nD
2bc40 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d 4f  oclist = (iTermO
2bc50 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20  ff ? iTermOff : 
2bc60 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a  szLeaf) - iOff;.
2bc70 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 44 6f      fts5DecodeDo
2bc80 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
2bc90 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73  a[iOff], nDoclis
2bca0 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
2bcb0 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20  iPgidxOff<n ){. 
2bcc0 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 20       int bFirst 
2bcd0 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73 7a  = (iPgidxOff==sz
2bce0 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54 72  Leaf);     /* Tr
2bcf0 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72  ue for first ter
2bd00 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  m on page */.   
2bd10 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd30 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2bd40 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20  s of data */.   
2bd50 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20     int iEnd;.   
2bd60 20 20 20 0a 20 20 20 20 20 20 69 50 67 69 64 78     .      iPgidx
2bd70 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2bd80 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
2bd90 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2bda0 20 20 20 20 69 50 67 69 64 78 50 72 65 76 20 2b      iPgidxPrev +
2bdb0 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  = nByte;.      i
2bdc0 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72 65 76  Off = iPgidxPrev
2bdd0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50 67  ;..      if( iPg
2bde0 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  idxOff<n ){.    
2bdf0 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
2be00 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
2be10 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2be20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64 78     iEnd = iPgidx
2be30 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20 20  Prev + nByte;.  
2be40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2be50 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61 66     iEnd = szLeaf
2be60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2be70 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29   if( bFirst==0 )
2be80 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
2be90 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2bea0 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
2beb0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d  e);.        term
2bec0 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  .n = nByte;.    
2bed0 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20 2b    }.      iOff +
2bee0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2bef0 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
2bf00 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
2bf10 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
2bf20 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65  rc, &term, nByte
2bf30 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  , &a[iOff]);.   
2bf40 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65     iOff += nByte
2bf50 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
2bf60 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2bf70 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
2bf80 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72    &rc, &s, " ter
2bf90 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c  m=%.*s", term.n,
2bfa0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65   (const char*)te
2bfb0 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20  rm.p.      );.  
2bfc0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2bfd0 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
2bfe0 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
2bff0 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20   iEnd-iOff);.   
2c000 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
2c010 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
2c020 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75   }.  . decode_ou
2c030 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
2c040 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e(a);.  if( rc==
2c050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c060 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2c070 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73  text(pCtx, (cons
2c080 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e  t char*)s.p, s.n
2c090 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
2c0a0 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
2c0b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2c0c0 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78  _error_code(pCtx
2c0d0 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73  , rc);.  }.  fts
2c0e0 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b  5BufferFree(&s);
2c0f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  .}../*.** The im
2c100 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2c110 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61  user-defined sca
2c120 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  lar function fts
2c130 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74  5_rowid()..*/.st
2c140 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f  atic void fts5Ro
2c150 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  widFunction(.  s
2c160 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2c170 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
2c180 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
2c190 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
2c1a0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
2c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c1c0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
2c1d0 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
2c1e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2c1f0 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
2c200 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
2c210 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ents */.){.  con
2c220 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
2c230 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a   if( nArg==0 ){.
2c240 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2c250 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22  lt_error(pCtx, "
2c260 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
2c270 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e  rowid(subject, .
2c280 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  ...)", -1);.  }e
2c290 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  lse{.    zArg = 
2c2a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2c2b0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2c2c0 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69  apVal[0]);.    i
2c2d0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
2c2e0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67  ricmp(zArg, "seg
2c2f0 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  ment") ){.      
2c300 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
2c310 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67 6e    int segid, pgn
2c320 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  o;.      if( nAr
2c330 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=3 ){.        
2c340 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2c350 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
2c360 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20          "should 
2c370 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27  be: fts5_rowid('
2c380 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c  segment', segid,
2c390 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20   pgno))", -1.   
2c3a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
2c3b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 67  lse{.        seg
2c3c0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
2c3d0 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29  ue_int(apVal[1])
2c3e0 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d  ;.        pgno =
2c3f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2c400 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  nt(apVal[2]);.  
2c410 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46        iRowid = F
2c420 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2c430 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  D(segid, pgno);.
2c440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c450 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
2c460 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
2c470 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2c480 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2c490 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
2c4a0 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20  .        "first 
2c4b0 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69  arg to fts5_rowi
2c4c0 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67  d() must be 'seg
2c4d0 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20 20  ment'" , -1.    
2c4e0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
2c4f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2c500 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
2c510 66 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68  f registering th
2c520 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69  e FTS5 module wi
2c530 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  th database.** c
2c540 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74  onnection db. It
2c550 20 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72   registers sever
2c560 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  al user-defined 
2c570 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73  scalar functions
2c580 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20   useful.** with 
2c590 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  FTS5..**.** If s
2c5a0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2c5b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2c5c0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2c5d0 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72  curs, some other
2c5e0 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  .** SQLite error
2c5f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2c600 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e  d instead..*/.in
2c610 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2c620 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a  exInit(sqlite3 *
2c630 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
2c640 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2c650 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64  unction(.      d
2c660 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22  b, "fts5_decode"
2c670 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
2c680 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46  , 0, fts5DecodeF
2c690 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
2c6a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2c6b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
2c6c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
2c6d0 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
2c6e0 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f      db, "fts5_ro
2c6f0 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  wid", -1, SQLITE
2c700 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f  _UTF8, 0, fts5Ro
2c710 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  widFunction, 0, 
2c720 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72  0.    );.  }.  r
2c730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a           eturn rc;.}..