/ Hex Artifact Content
Login

Artifact ca8310eaa286e6c1e4c4581a420b7c3a1ec6302c:


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 74 79 70 65 64 65  ve */.};..typede
1f1a0 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  f struct Poslist
1f1b0 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73 6c 69  OffsetsCtx Posli
1f1c0 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a 73 74  stOffsetsCtx;.st
1f1d0 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73  ruct PoslistOffs
1f1e0 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73 35 42  etsCtx {.  Fts5B
1f1f0 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20  uffer *pBuf;    
1f200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
1f210 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66  pend to this buf
1f220 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  fer */.  Fts5Col
1f230 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20  set *pColset;   
1f240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1f250 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
1f260 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  this column */. 
1f270 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 69 6e   int iRead;.  in
1f280 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a  t iWrite;.};../*
1f290 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74  .** TODO: Make t
1f2a0 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65  his more efficie
1f2b0 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt!.*/.static in
1f2c0 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  t fts5IndexColse
1f2d0 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73 65 74  tTest(Fts5Colset
1f2e0 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69   *pColset, int i
1f2f0 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1f300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
1f310 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  set->nCol; i++){
1f320 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
1f330 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c  ->aiCol[i]==iCol
1f340 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
1f350 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f360 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1f370 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61  PoslistOffsetsCa
1f380 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
1f390 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20  dex *p, .  void 
1f3a0 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
1f3b0 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
1f3c0 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
1f3d0 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
1f3e0 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
1f3f0 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43  stOffsetsCtx*)pC
1f400 6f 6e 74 65 78 74 3b 0a 20 20 61 73 73 65 72 74  ontext;.  assert
1f410 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
1f420 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
1f430 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
1f440 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c  0;.    while( i<
1f450 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
1f460 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
1f470 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
1f480 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c  nt32(&pChunk[i],
1f490 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 56   iVal);.      iV
1f4a0 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61  al += pCtx->iRea
1f4b0 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43 74  d - 2;.      pCt
1f4c0 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c 3b  x->iRead = iVal;
1f4d0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49  .      if( fts5I
1f4e0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
1f4f0 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56  Ctx->pColset, iV
1f500 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  al) ){.        f
1f510 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1f520 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e  endVarint(pCtx->
1f530 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d  pBuf, iVal + 2 -
1f540 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a   pCtx->iWrite);.
1f550 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69 57          pCtx->iW
1f560 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20  rite = iVal;.   
1f570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1f580 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1f590 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
1f5a0 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
1f5b0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
1f5c0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
1f5d0 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
1f5e0 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
1f5f0 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
1f600 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73  Ctx *pCtx = (Pos
1f610 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a  listCallbackCtx*
1f620 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 61 73 73  )pContext;.  ass
1f630 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
1f640 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
1f650 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  k>0 ){.    /* Se
1f660 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20  arch through to 
1f670 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76  find the first v
1f680 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
1f690 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a   1. This is the.
1f6a0 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20      ** start of 
1f6b0 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73  the next columns
1f6c0 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e   hits. */.    in
1f6d0 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
1f6e0 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20   iStart = 0;..  
1f6f0 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
1f700 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  te==2 ){.      i
1f710 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66  nt iCol;.      f
1f720 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
1f730 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
1f740 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ol);.      if( f
1f750 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
1f760 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
1f770 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  , iCol) ){.     
1f780 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
1f790 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73  = 1;.        fts
1f7a0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1f7b0 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42  dVarint(pCtx->pB
1f7c0 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  uf, 1);.      }e
1f7d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
1f7e0 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20  x->eState = 0;. 
1f7f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f800 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69    do {.      whi
1f810 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20  le( i<nChunk && 
1f820 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20  pChunk[i]!=0x01 
1f830 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
1f840 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78  ( pChunk[i] & 0x
1f850 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  80 ) i++;.      
1f860 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
1f870 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
1f880 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
1f890 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1f8a0 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e  ppendBlob(pCtx->
1f8b0 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53  pBuf, &pChunk[iS
1f8c0 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29  tart], i-iStart)
1f8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f8e0 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  if( i<nChunk ){.
1f8f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
1f900 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
1f910 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b   = i;.        i+
1f920 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  +;.        if( i
1f930 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >=nChunk ){.    
1f940 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
1f950 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
1f960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f970 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
1f980 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20  nt32(pChunk, i, 
1f990 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iCol);.         
1f9a0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
1f9b0 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
1f9c0 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
1f9d0 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
1f9e0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
1f9f0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
1fa00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1fa10 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74  feAppendBlob(pCt
1fa20 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b  x->pBuf, &pChunk
1fa30 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61  [iStart], i-iSta
1fa40 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
1fa50 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
1fa60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fa70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fa80 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
1fa90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1faa0 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
1fab0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1fac0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1fad0 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73   (not EOF). This
1fae0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
1faf0 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f  ends the positio
1fb00 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20  n list data for 
1fb10 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1fb20 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  y to.** buffer p
1fb30 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  Buf. It does not
1fb40 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
1fb50 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
1fb60 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e  t size.** field.
1fb70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fb80 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
1fb90 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
1fba0 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65  *p,.  Fts5SegIte
1fbb0 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43  r *pSeg,.  Fts5C
1fbc0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a  olset *pColset,.
1fbd0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1fbe0 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66  uf.){.  if( 0==f
1fbf0 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
1fc00 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67  ->rc, pBuf, pSeg
1fc10 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20 69  ->nPos) ){.    i
1fc20 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b  f( pColset==0 ){
1fc30 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b  .      fts5Chunk
1fc40 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c  Iterate(p, pSeg,
1fc50 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74   (void*)pBuf, ft
1fc60 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  s5PoslistCallbac
1fc70 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
1fc80 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e       if( p->pCon
1fc90 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
1fca0 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29  S5_DETAIL_FULL )
1fcb0 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73  {.        Poslis
1fcc0 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74  tCallbackCtx sCt
1fcd0 78 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  x;.        sCtx.
1fce0 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20  pBuf = pBuf;.   
1fcf0 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65       sCtx.pColse
1fd00 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20  t = pColset;.   
1fd10 20 20 20 20 20 73 43 74 78 2e 65 53 74 61 74 65       sCtx.eState
1fd20 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73   = fts5IndexCols
1fd30 65 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20  etTest(pColset, 
1fd40 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
1fd50 72 74 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d  rt( sCtx.eState=
1fd60 3d 30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74  =0 || sCtx.eStat
1fd70 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1fd80 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
1fd90 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a  (p, pSeg, (void*
1fda0 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c  )&sCtx, fts5Posl
1fdb0 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63  istFilterCallbac
1fdc0 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  k);.      }else{
1fdd0 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74  .        Poslist
1fde0 4f 66 66 73 65 74 73 43 74 78 20 73 43 74 78 3b  OffsetsCtx sCtx;
1fdf0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
1fe00 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  &sCtx, 0, sizeof
1fe10 28 73 43 74 78 29 29 3b 0a 20 20 20 20 20 20 20  (sCtx));.       
1fe20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75   sCtx.pBuf = pBu
1fe30 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  f;.        sCtx.
1fe40 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
1fe50 74 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  t;.        fts5C
1fe60 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
1fe70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74  Seg, (void*)&sCt
1fe80 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66  x, fts5PoslistOf
1fe90 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a  fsetsCallback);.
1fea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1feb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55  }.}../*.** IN/OU
1fec0 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61  T parameter (*pa
1fed0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f  ) points to a po
1fee0 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79  sition list n by
1fef0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a  tes in size. If.
1ff00 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ** the position 
1ff10 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e  list contains en
1ff20 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  tries for column
1ff30 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61   iCol, then (*pa
1ff40 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70  ) is set.** to p
1ff50 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d  oint to the sub-
1ff60 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f  position-list fo
1ff70 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e  r that column an
1ff80 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
1ff90 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20 72  ** bytes in it r
1ffa0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
1ffb0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73  the argument pos
1ffc0 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20  ition list does 
1ffd0 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  not.** contain a
1ffe0 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63  ny entries for c
1fff0 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75  olumn iCol, retu
20000 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
20010 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74  int fts5IndexExt
20020 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74  ractCol(.  const
20030 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20   u8 **pa,       
20040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
20050 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f  /OUT: Pointer to
20060 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   poslist */.  in
20070 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20090 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73   IN: Size of pos
200a0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
200b0 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
200e0 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73  extract from pos
200f0 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  list */.){.  int
20100 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20120 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20  Anything before 
20130 74 68 65 20 66 69 72 73 74 20 30 78 30 31 20 69  the first 0x01 i
20140 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e  s col 0 */.  con
20150 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a  st u8 *p = *pa;.
20160 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64    const u8 *pEnd
20170 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20   = &p[n];       
20180 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61    /* One byte pa
20190 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69  st end of positi
201a0 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  on list */.  u8 
201b0 70 72 65 76 20 3d 20 30 3b 0a 0a 20 20 77 68 69  prev = 0;..  whi
201c0 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e  le( iCol>iCurren
201d0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61  t ){.    /* Adva
201e0 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e  nce pointer p un
201f0 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
20200 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31   pEnd or an 0x01
20210 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20   byte that is.  
20220 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66    ** not part of
20230 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 20   a varint */.   
20240 20 77 68 69 6c 65 28 20 28 70 72 65 76 20 26 20   while( (prev & 
20250 30 78 38 30 29 20 7c 7c 20 2a 70 21 3d 30 78 30  0x80) || *p!=0x0
20260 31 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76 20  1 ){.      prev 
20270 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 20 20 69 66  = *p++;.      if
20280 28 20 70 3d 3d 70 45 6e 64 20 29 20 72 65 74 75  ( p==pEnd ) retu
20290 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
202a0 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 70  *pa = p++;.    p
202b0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
202c0 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74 29  t32(p, iCurrent)
202d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
202e0 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65 74  !=iCurrent ) ret
202f0 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76  urn 0;..  /* Adv
20300 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
20310 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
20320 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
20330 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
20340 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
20350 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 61 73  a varint */.  as
20360 73 65 72 74 28 20 28 70 72 65 76 20 26 20 30 78  sert( (prev & 0x
20370 38 30 29 3d 3d 30 20 29 3b 0a 20 20 77 68 69 6c  80)==0 );.  whil
20380 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 28 70  e( p<pEnd && ((p
20390 72 65 76 20 26 20 30 78 38 30 29 20 7c 7c 20 2a  rev & 0x80) || *
203a0 70 21 3d 30 78 30 31 29 20 29 7b 0a 20 20 20 20  p!=0x01) ){.    
203b0 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20 7d  prev = *p++;.  }
203c0 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a  .  return p - (*
203d0 70 61 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  pa);.}.../*.** I
203e0 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63  terator pMulti c
203f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
20400 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
20410 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73   (not EOF). This
20420 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
20430 65 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ends the followi
20440 6e 67 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  ng to buffer pBu
20450 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  f:.**.**   * The
20460 20 76 61 72 69 6e 74 20 69 44 65 6c 74 61 2c 20   varint iDelta, 
20470 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 70  and.**   * the p
20480 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61  osition list tha
20490 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
204a0 74 73 20 74 6f 2c 20 69 6e 63 6c 75 64 69 6e 67  ts to, including
204b0 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 2e   the size field.
204c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
204d0 6e 74 20 70 43 6f 6c 73 65 74 20 69 73 20 4e 55  nt pColset is NU
204e0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 73  LL, then the pos
204f0 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20 66 69  ition list is fi
20500 6c 74 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  ltered according
20510 0a 2a 2a 20 74 6f 20 70 43 6f 6c 73 65 74 20 62  .** to pColset b
20520 65 66 6f 72 65 20 62 65 69 6e 67 20 61 70 70 65  efore being appe
20530 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
20540 65 72 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  er. If this mean
20550 73 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  s there are.** n
20560 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  o entries in the
20570 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20   position list, 
20580 6e 6f 74 68 69 6e 67 20 69 73 20 61 70 70 65 6e  nothing is appen
20590 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
205a0 72 20 28 6e 6f 74 0a 2a 2a 20 65 76 65 6e 20 69  r (not.** even i
205b0 44 65 6c 74 61 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Delta)..**.** If
205c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
205d0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
205e0 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63  is left in p->rc
205f0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
20600 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69   fts5AppendPosli
20610 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
20620 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61  *p,.  i64 iDelta
20630 2c 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ,.  Fts5IndexIte
20640 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73  r *pMulti,.  Fts
20650 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
20660 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
20670 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d  pBuf.){.  if( p-
20680 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
20690 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
206a0 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74  r *pSeg = &pMult
206b0 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d  i->aSeg[ pMulti-
206c0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
206d0 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t ];.    assert(
206e0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
206f0 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20  f(p, pMulti)==0 
20700 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20710 53 65 67 2d 3e 6e 50 6f 73 3e 30 20 29 3b 0a 20  Seg->nPos>0 );. 
20720 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75     if( 0==fts5Bu
20730 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
20740 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f   pBuf, pSeg->nPo
20750 73 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20  s+9+9) ){.      
20760 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  if( p->pConfig->
20770 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
20780 54 41 49 4c 5f 46 55 4c 4c 0a 20 20 20 20 20 20  TAIL_FULL.      
20790 20 26 26 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f   && pSeg->iLeafO
207a0 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
207b0 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
207c0 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20 26 26  zLeaf .       &&
207d0 20 28 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20   (pColset==0 || 
207e0 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31  pColset->nCol==1
207f0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
20800 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f     const u8 *pPo
20810 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  s = &pSeg->pLeaf
20820 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
20830 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
20840 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
20850 20 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29 7b    if( pColset ){
20860 0a 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 20  .          nPos 
20870 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  = fts5IndexExtra
20880 63 74 43 6f 6c 28 26 70 50 6f 73 2c 20 70 53 65  ctCol(&pPos, pSe
20890 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74  g->nPos, pColset
208a0 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20  ->aiCol[0]);.   
208b0 20 20 20 20 20 20 20 69 66 28 20 6e 50 6f 73 3d         if( nPos=
208c0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
208d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
208e0 20 20 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70          nPos = p
208f0 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 20  Seg->nPos;.     
20900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
20910 65 72 74 28 20 6e 50 6f 73 3e 30 20 29 3b 0a 20  ert( nPos>0 );. 
20920 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20930 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
20940 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  t(pBuf, iDelta);
20950 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
20960 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
20970 69 6e 74 28 70 42 75 66 2c 20 6e 50 6f 73 2a 32  int(pBuf, nPos*2
20980 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
20990 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
209a0 6c 6f 62 28 70 42 75 66 2c 20 70 50 6f 73 2c 20  lob(pBuf, pPos, 
209b0 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nPos);.      }el
209c0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
209d0 69 53 76 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  iSv1;.        in
209e0 74 20 69 53 76 32 3b 0a 20 20 20 20 20 20 20 20  t iSv2;.        
209f0 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 20 20  int iData;..    
20a00 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 69 44      /* Append iD
20a10 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20  elta */.        
20a20 69 53 76 31 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a  iSv1 = pBuf->n;.
20a30 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20a40 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
20a50 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29  nt(pBuf, iDelta)
20a60 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52  ;..        /* WR
20a70 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
20a80 2f 0a 20 20 20 20 20 20 20 20 69 53 76 32 20 3d  /.        iSv2 =
20a90 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20   pBuf->n;.      
20aa0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
20ab0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
20ac0 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32 29  f, pSeg->nPos*2)
20ad0 3b 0a 20 20 20 20 20 20 20 20 69 44 61 74 61 20  ;.        iData 
20ae0 3d 20 70 42 75 66 2d 3e 6e 3b 0a 0a 20 20 20 20  = pBuf->n;..    
20af0 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
20b00 6f 73 6c 69 73 74 28 70 2c 20 70 53 65 67 2c 20  oslist(p, pSeg, 
20b10 70 43 6f 6c 73 65 74 2c 20 70 42 75 66 29 3b 0a  pColset, pBuf);.
20b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
20b30 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lset ){.        
20b40 20 20 69 6e 74 20 6e 41 63 74 75 61 6c 20 3d 20    int nActual = 
20b50 70 42 75 66 2d 3e 6e 20 2d 20 69 44 61 74 61 3b  pBuf->n - iData;
20b60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
20b70 41 63 74 75 61 6c 21 3d 70 53 65 67 2d 3e 6e 50  Actual!=pSeg->nP
20b80 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  os ){.          
20b90 20 20 69 66 28 20 6e 41 63 74 75 61 6c 3d 3d 30    if( nActual==0
20ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20bb0 20 20 70 42 75 66 2d 3e 6e 20 3d 20 69 53 76 31    pBuf->n = iSv1
20bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20bd0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
20be0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20bf0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
20c00 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Req = sqlite3Fts
20c10 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 28 75  5GetVarintLen((u
20c20 33 32 29 28 6e 41 63 74 75 61 6c 2a 32 29 29 3b  32)(nActual*2));
20c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
20c40 68 69 6c 65 28 20 69 53 76 32 3c 28 69 44 61 74  hile( iSv2<(iDat
20c50 61 2d 6e 52 65 71 29 20 29 7b 20 70 42 75 66 2d  a-nReq) ){ pBuf-
20c60 3e 70 5b 69 53 76 32 2b 2b 5d 20 3d 20 30 78 38  >p[iSv2++] = 0x8
20c70 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  0; }.           
20c80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75     sqlite3Fts5Pu
20c90 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
20ca0 5b 69 53 76 32 5d 2c 20 6e 41 63 74 75 61 6c 2a  [iSv2], nActual*
20cb0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
20cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
20cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
20cf0 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 74 61 74 69  urn 0;.}...stati
20d00 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
20d10 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  stIterNext(Fts5D
20d20 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
20d30 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70 49  r){.  u8 *p = pI
20d40 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20  ter->aPoslist + 
20d50 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20 70  pIter->nSize + p
20d60 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a  Iter->nPoslist;.
20d70 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
20d80 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20  ->aPoslist );.  
20d90 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61 45  if( p>=pIter->aE
20da0 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  of ){.    pIter-
20db0 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20  >aPoslist = 0;. 
20dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
20dd0 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20 2b  iDelta;..    p +
20de0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
20df0 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  p, (u64*)&iDelta
20e00 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
20e10 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
20e20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f 73  .    /* Read pos
20e30 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
20e40 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d 20  */.    if( p[0] 
20e50 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  & 0x80 ){.      
20e60 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
20e70 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 66  pIter->nSize = f
20e80 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts5GetVarint32(p
20e90 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 70  , nPos);.      p
20ea0 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d  Iter->nPoslist =
20eb0 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20 20   (nPos>>1);.    
20ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
20ed0 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28  er->nPoslist = (
20ee0 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e 20  (int)(p[0])) >> 
20ef0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  1;.      pIter->
20f00 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nSize = 1;.    }
20f10 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  ..    pIter->aPo
20f20 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d  slist = p;.  }.}
20f30 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
20f40 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
20f50 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t(.  Fts5Buffer 
20f60 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44 6f  *pBuf, .  Fts5Do
20f70 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
20f80 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  .){.  memset(pIt
20f90 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
20fa0 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
20fb0 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75 66  >aPoslist = pBuf
20fc0 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61 45  ->p;.  pIter->aE
20fd0 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70 42  of = &pBuf->p[pB
20fe0 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44 6f  uf->n];.  fts5Do
20ff0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49  clistIterNext(pI
21000 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  ter);.}..#if 0./
21010 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f  *.** Append a do
21020 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20  clist to buffer 
21030 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
21040 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
21050 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69 74  s that space wit
21060 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 68  hin the buffer h
21070 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
21080 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f  ** allocated..*/
21090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
210a0 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
210b0 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d(.  Fts5Buffer 
210c0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
210d0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
210e0 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
210f0 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  i64 *piLastRowid
21100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21110 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69  /* IN/OUT: Previ
21120 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65  ous rowid writte
21130 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  n (if any) */.  
21140 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20  i64 iRowid      
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21160 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65  /* Rowid to appe
21170 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  nd */.){.  asser
21180 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c  t( pBuf->n!=0 ||
21190 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3d   (*piLastRowid)=
211a0 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66  =0 );.  fts5Buff
211b0 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
211c0 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64 20  nt(pBuf, iRowid 
211d0 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b  - *piLastRowid);
211e0 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20  .  *piLastRowid 
211f0 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64  = iRowid;.}.#end
21200 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  if..#define fts5
21210 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
21220 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77 69  (pBuf, iLastRowi
21230 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20 20  d, iRowid) {    
21240 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
21250 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28  pBuf)->n!=0 || (
21260 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29  iLastRowid)==0 )
21270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21280 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66 66      \.  fts5Buff
21290 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
212a0 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f 77  nt((pBuf), (iRow
212b0 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77 69  id) - (iLastRowi
212c0 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74 52  d)); \.  (iLastR
212d0 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64 29  owid) = (iRowid)
212e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
21310 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20   Buffers p1 and 
21320 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69  p2 contain docli
21330 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  sts. This functi
21340 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f  on merges the co
21350 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  ntent.** of the 
21360 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67  two doclists tog
21370 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62  ether and sets b
21380 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20  uffer p1 to the 
21390 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a  result before.**
213a0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
213b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
213c0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
213d0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
213e0 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  ->rc. If an erro
213f0 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  r has.** already
21400 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
21410 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
21420 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
21430 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65  oid fts5MergePre
21440 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35  fixLists(.  Fts5
21450 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
21460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21470 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
21480 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ct */.  Fts5Buff
21490 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
214a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
214b0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
214c0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
214d0 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
214e0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
214f0 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
21500 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b  {.  if( p2->n ){
21510 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
21520 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
21530 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b  5DoclistIter i1;
21540 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
21550 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73  Iter i2;.    Fts
21560 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 20  5Buffer out;.   
21570 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 3b   Fts5Buffer tmp;
21580 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75 74  .    memset(&out
21590 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29  , 0, sizeof(out)
215a0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  );.    memset(&t
215b0 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 6d  mp, 0, sizeof(tm
215c0 70 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  p));..    sqlite
215d0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
215e0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31  &p->rc, &out, p1
215f0 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20  ->n + p2->n);.  
21600 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
21610 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a  rInit(p1, &i1);.
21620 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
21630 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29  terInit(p2, &i2)
21640 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
21650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21660 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d 30   (i1.aPoslist!=0
21670 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 21   || i2.aPoslist!
21680 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =0) ){.      if(
21690 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i2.aPoslist==0 
216a0 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 20  || (i1.aPoslist 
216b0 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e  && i1.iRowid<i2.
216c0 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20  iRowid) ){.     
216d0 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
216e0 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20   from i1 */.    
216f0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
21700 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
21710 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
21720 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
21730 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
21740 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31  endBlob(&out, i1
21750 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50  .aPoslist, i1.nP
21760 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29  oslist+i1.nSize)
21770 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
21780 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
21790 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
217a0 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50    else if( i1.aP
217b0 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e  oslist==0 || i2.
217c0 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69  iRowid!=i1.iRowi
217d0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
217e0 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
217f0 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i2 */.        ft
21800 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
21810 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
21820 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
21830 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
21840 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
21850 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
21860 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  ist, i2.nPoslist
21870 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i2.nSize);.    
21880 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
21890 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
218a0 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
218b0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50  {.        i64 iP
218c0 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  os1 = 0;.       
218d0 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b 0a   i64 iPos2 = 0;.
218e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
218f0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  1 = 0;.        i
21900 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20 20  nt iOff2 = 0;.  
21910 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20 26        u8 *a1 = &
21920 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e 6e  i1.aPoslist[i1.n
21930 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 75  Size];.        u
21940 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f 73  8 *a2 = &i2.aPos
21950 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a  list[i2.nSize];.
21960 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
21970 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65  listWriter write
21980 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  r;.        memse
21990 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69  t(&writer, 0, si
219a0 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a  zeof(writer));..
219b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65          /* Merge
219c0 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f   the two positio
219d0 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20  n lists. */ .   
219e0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
219f0 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
21a00 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
21a10 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
21a20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
21a30 74 6d 70 29 3b 0a 0a 20 20 20 20 20 20 20 20 73  tmp);..        s
21a40 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
21a50 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
21a60 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
21a70 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
21a80 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
21a90 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69  listNext64(a2, i
21aa0 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  2.nPoslist, &iOf
21ab0 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 0a 20 20  f2, &iPos2);..  
21ac0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
21ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21ae0 20 28 69 50 6f 73 31 3e 3d 30 20 7c 7c 20 69 50   (iPos1>=0 || iP
21af0 6f 73 32 3e 3d 30 29 20 29 7b 0a 20 20 20 20 20  os2>=0) ){.     
21b00 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20       i64 iNew;. 
21b10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
21b20 73 32 3c 30 20 7c 7c 20 28 69 50 6f 73 31 3e 3d  s2<0 || (iPos1>=
21b30 30 20 26 26 20 69 50 6f 73 31 3c 69 50 6f 73 32  0 && iPos1<iPos2
21b40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
21b50 20 69 4e 65 77 20 3d 20 69 50 6f 73 31 3b 0a 20   iNew = iPos1;. 
21b60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21b70 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
21b80 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c  t64(a1, i1.nPosl
21b90 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50  ist, &iOff1, &iP
21ba0 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
21bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21bc0 20 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 32 3b     iNew = iPos2;
21bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21be0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
21bf0 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f  ext64(a2, i2.nPo
21c00 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26  slist, &iOff2, &
21c10 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
21c20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3d 3d 69      if( iPos1==i
21c30 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos2 ){.        
21c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
21c50 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
21c60 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
21c70 26 69 4f 66 66 31 2c 26 69 50 6f 73 31 29 3b 0a  &iOff1,&iPos1);.
21c80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ca0 20 20 20 20 69 66 28 20 69 4e 65 77 21 3d 77 72      if( iNew!=wr
21cb0 69 74 65 72 2e 69 50 72 65 76 20 7c 7c 20 74 6d  iter.iPrev || tm
21cc0 70 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p.n==0 ){.      
21cd0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
21ce0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
21cf0 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 74 6d  WriterAppend(&tm
21d00 70 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65 77  p, &writer, iNew
21d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21d20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21d30 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
21d40 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
21d50 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
21d60 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
21d70 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20  , tmp.n * 2);.  
21d80 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21d90 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
21da0 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e  out, tmp.p, tmp.
21db0 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
21dc0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
21dd0 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
21de0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
21df0 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i2);.      }.
21e00 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
21e10 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
21e20 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e   p1, out.n, out.
21e30 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
21e40 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20  erFree(&tmp);.  
21e50 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
21e60 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (&out);.  }.}../
21e70 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f  *.** Swap the co
21e80 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72  ntents of buffer
21e90 20 2a 70 31 20 77 69 74 68 20 74 68 61 74 20 6f   *p1 with that o
21ea0 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  f *p2..*/.static
21eb0 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72   void fts5Buffer
21ec0 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20  Swap(Fts5Buffer 
21ed0 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20  *p1, Fts5Buffer 
21ee0 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66  *p2){.  Fts5Buff
21ef0 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20  er tmp = *p1;.  
21f00 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32  *p1 = *p2;.  *p2
21f10 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69   = tmp;.}..stati
21f20 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70  c void fts5Setup
21f30 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74  PrefixIter(.  Ft
21f40 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f60 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66   Index to read f
21f70 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  rom */.  int bDe
21f80 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
21f90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21fa0 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72   for "ORDER BY r
21fb0 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20  owid DESC" */.  
21fc0 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e  const u8 *pToken
21fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21fe0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
21ff0 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d  ning prefix to m
22000 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  atch */.  int nT
22010 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
22020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
22030 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b  e of buffer pTok
22040 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  en in bytes */. 
22050 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
22060 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
22070 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
22080 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f  ches to these co
22090 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49  lumns */.  Fts5I
220a0 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
220b0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
220c0 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
220d0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
220e0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
220f0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
22100 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
22110 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42  nBuf = 32;..  aB
22120 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72  uf = (Fts5Buffer
22130 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
22140 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  p, sizeof(Fts5Bu
22150 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70  ffer)*nBuf);.  p
22160 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
22170 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
22180 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53    if( aBuf && pS
22190 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e  truct ){.    con
221a0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
221b0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
221c0 43 41 4e 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  CAN;.    int i;.
221d0 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
221e0 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  id = 0;.    Fts5
221f0 49 6e 64 65 78 49 74 65 72 20 2a 70 31 20 3d 20  IndexIter *p1 = 
22200 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  0;     /* Iterat
22210 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65  or used to gathe
22220 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65  r data from inde
22230 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  x */.    Fts5Dat
22240 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74  a *pData;.    Ft
22250 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74  s5Buffer doclist
22260 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65  ;.    int bNewTe
22270 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d  rm = 1;..    mem
22280 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c  set(&doclist, 0,
22290 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29   sizeof(doclist)
222a0 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d  );.    for(fts5M
222b0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
222c0 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73  Struct, 1, flags
222d0 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
222e0 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20  , -1, 0, &p1);. 
222f0 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
22300 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d  IterEof(p, p1)==
22310 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  0;.        fts5M
22320 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c  ultiIterNext2(p,
22330 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a   p1, &bNewTerm).
22340 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34      ){.      i64
22350 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
22360 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 31 29  ltiIterRowid(p1)
22370 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  ;.      int nTer
22380 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  m;.      const u
22390 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d  8 *pTerm = fts5M
223a0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c  ultiIterTerm(p1,
223b0 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20   &nTerm);.      
223c0 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d  assert_nc( memcm
223d0 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
223e0 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65   MIN(nToken, nTe
223f0 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20  rm))<=0 );.     
22400 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b   if( bNewTerm ){
22410 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 65  .        if( nTe
22420 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d  rm<nToken || mem
22430 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
22440 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65  m, nToken) ) bre
22450 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
22460 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e     if( doclist.n
22470 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c  >0 && iRowid<=iL
22480 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  astRowid ){.    
22490 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e      for(i=0; p->
224a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
224b0 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29   doclist.n; i++)
224c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
224d0 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20  rt( i<nBuf );.  
224e0 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66          if( aBuf
224f0 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  [i].n==0 ){.    
22500 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
22510 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c  erSwap(&doclist,
22520 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
22530 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
22540 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29  erZero(&doclist)
22550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
22560 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
22570 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
22580 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  sts(p, &doclist,
22590 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
225a0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
225b0 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29  erZero(&aBuf[i])
225c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
225d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
225e0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
225f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
22600 66 28 20 21 66 74 73 35 41 70 70 65 6e 64 50 6f  f( !fts5AppendPo
22610 73 6c 69 73 74 28 70 2c 20 69 52 6f 77 69 64 2d  slist(p, iRowid-
22620 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20  iLastRowid, p1, 
22630 70 43 6f 6c 73 65 74 2c 20 26 64 6f 63 6c 69 73  pColset, &doclis
22640 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  t) ){.        iL
22650 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
22660 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
22670 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
22680 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nBuf; i++){.   
22690 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
226a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
226b0 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66     fts5MergePref
226c0 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f 63 6c  ixLists(p, &docl
226d0 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
226e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
226f0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42  s5BufferFree(&aB
22700 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  uf[i]);.    }.  
22710 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
22720 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20  ree(p, p1);..   
22730 20 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78   pData = fts5Idx
22740 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
22750 28 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63  (Fts5Data) + doc
22760 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28  list.n);.    if(
22770 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
22780 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29  pData->p = (u8*)
22790 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20  &pData[1];.     
227a0 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61   pData->nn = pDa
227b0 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63  ta->szLeaf = doc
227c0 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65  list.n;.      me
227d0 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64  mcpy(pData->p, d
227e0 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73  oclist.p, doclis
227f0 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  t.n);.      fts5
22800 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c  MultiIterNew2(p,
22810 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70   pData, bDesc, p
22820 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
22830 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
22840 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a  (&doclist);.  }.
22850 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
22860 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
22870 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
22880 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  (aBuf);.}.../*.*
22890 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
228a0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63  all subsequent c
228b0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46  alls to sqlite3F
228c0 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20  ts5IndexWrite() 
228d0 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68  pertain.** to th
228e0 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
228f0 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f  rowid iRowid..*/
22900 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22910 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
22920 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
22930 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69  t bDelete, i64 i
22940 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74  Rowid){.  assert
22950 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
22960 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  OK );..  /* Allo
22970 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61  cate the hash ta
22980 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ble if it has no
22990 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  t already been a
229a0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66  llocated */.  if
229b0 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b  ( p->pHash==0 ){
229c0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
229d0 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28  ite3Fts5HashNew(
229e0 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e  p->pConfig, &p->
229f0 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
22a00 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
22a10 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
22a20 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
22a30 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
22a40 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e    if( iRowid<p->
22a50 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20  iWriteRowid .   
22a60 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69  || (iRowid==p->i
22a70 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d  WriteRowid && p-
22a80 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20  >bDelete==0).   
22a90 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  || (p->nPendingD
22aa0 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67  ata > p->pConfig
22ab0 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20  ->nHashSize) .  
22ac0 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
22ad0 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20  Flush(p);.  }.. 
22ae0 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20   p->iWriteRowid 
22af0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62  = iRowid;.  p->b
22b00 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65  Delete = bDelete
22b10 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
22b20 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
22b30 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64  ../*.** Commit d
22b40 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ata to disk..*/.
22b50 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
22b60 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64  ndexSync(Fts5Ind
22b70 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d  ex *p, int bComm
22b80 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  it){.  assert( p
22b90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22ba0 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  );.  fts5IndexFl
22bb0 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43  ush(p);.  if( bC
22bc0 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73  ommit ) fts5Clos
22bd0 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65  eReader(p);.  re
22be0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
22bf0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
22c00 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61  * Discard any da
22c10 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
22c20 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
22c30 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77  tables. Do not w
22c40 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68  rite it.** to th
22c50 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
22c60 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65  tionally, assume
22c70 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
22c80 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61  ts of the %_data
22c90 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
22ca0 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
22cb0 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
22cc0 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
22cd0 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64  _data .** record
22ce0 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69  s must be invali
22cf0 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  dated..*/.int sq
22d00 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
22d10 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78  llback(Fts5Index
22d20 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73   *p){.  fts5Clos
22d30 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74  eReader(p);.  ft
22d40 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
22d50 74 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  ta(p);.  assert(
22d60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
22d70 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  K );.  return SQ
22d80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22d90 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62  * The %_data tab
22da0 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  le is completely
22db0 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73   empty when this
22dc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22dd0 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  led. This.** fun
22de0 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20  ction populates 
22df0 69 74 20 77 69 74 68 20 74 68 65 20 69 6e 69 74  it with the init
22e00 69 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62  ial structure ob
22e10 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 69  jects for each i
22e20 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ndex,.** and the
22e30 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e   initial version
22e40 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67 65   of the "average
22e50 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72  s" record (a zer
22e60 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f  o-byte blob)..*/
22e70 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22e80 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35  IndexReinit(Fts5
22e90 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
22ea0 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20 20  5Structure s;.  
22eb0 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
22ec0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
22ed0 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74 61  re));.  fts5Data
22ee0 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56  Write(p, FTS5_AV
22ef0 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28 63  ERAGES_ROWID, (c
22f00 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b  onst u8*)"", 0);
22f10 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
22f20 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20 20  Write(p, &s);.  
22f30 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
22f40 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
22f50 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46  .** Open a new F
22f60 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
22f70 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20   If the bCreate 
22f80 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
22f90 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20  , create.** and 
22fa0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75  initialize the u
22fb0 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61  nderlying %_data
22fc0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
22fd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
22fe0 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
22ff0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
23000 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
23010 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  E_OK..** Otherwi
23020 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  se, set *pp to N
23030 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ULL and return a
23040 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
23050 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
23060 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
23070 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
23080 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20  pConfig, .  int 
23090 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35  bCreate, .  Fts5
230a0 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68  Index **pp,.  ch
230b0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
230c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
230d0 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  OK;.  Fts5Index 
230e0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
230f0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
23100 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20  ect */..  *pp = 
23110 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29  p = (Fts5Index*)
23120 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
23130 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
23140 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20  f(Fts5Index));. 
23150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23160 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f  OK ){.    p->pCo
23170 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
23180 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74      p->nWorkUnit
23190 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
231a0 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61 54  T;.    p->zDataT
231b0 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  bl = sqlite3Fts5
231c0 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73  Mprintf(&rc, "%s
231d0 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67 2d  _data", pConfig-
231e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
231f0 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20   p->zDataTbl && 
23200 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20  bCreate ){.     
23210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
23220 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20  5CreateTable(.  
23230 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c          pConfig,
23240 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e 54   "data", "id INT
23250 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
23260 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30  , block BLOB", 0
23270 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29 3b  , pzErr.      );
23280 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
23290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
232b0 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28  Fts5CreateTable(
232c0 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c 20  pConfig, "idx", 
232d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65  .            "se
232e0 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c  gid, term, pgno,
232f0 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67   PRIMARY KEY(seg
23300 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20 20  id, term)", .   
23310 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45 72           1, pzEr
23320 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
23330 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23350 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
23360 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
23370 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nit(p);.      }.
23380 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
23390 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
233a0 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
233b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
233c0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
233d0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
233e0 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  p);.    *pp = 0;
233f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
23410 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64   a handle opened
23420 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
23430 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
23440 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a  s5IndexOpen()..*
23450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
23460 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35  5IndexClose(Fts5
23470 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
23480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23490 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
234a0 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64  assert( p->pRead
234b0 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  er==0 );.    sql
234c0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
234d0 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  >pWriter);.    s
234e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
234f0 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
23500 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
23510 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ze(p->pIdxWriter
23520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23530 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 44  inalize(p->pIdxD
23540 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  eleter);.    sql
23550 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
23560 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  >pIdxSelect);.  
23570 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
23580 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b  hFree(p->pHash);
23590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
235a0 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a  e(p->zDataTbl);.
235b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
235c0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
235d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
235e0 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73  rgument p points
235f0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
23600 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65  taining utf-8 te
23610 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79 74  xt that is n byt
23620 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20  es in .** size. 
23630 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
23640 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
23650 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  e nChar characte
23660 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a  r prefix of the.
23670 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20  ** buffer, or 0 
23680 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  if there are les
23690 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  s than nChar cha
236a0 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c  racters in total
236b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
236c0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
236d0 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
236e0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
236f0 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c  p, .  int nByte,
23700 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a 29 7b   .  int nChar.){
23710 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
23720 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
23730 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
23740 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74  .    if( n>=nByt
23750 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
23760 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74     /* Input cont
23770 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
23780 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20  nChar chars */. 
23790 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
237a0 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78   char)p[n++]>=0x
237b0 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
237c0 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29  e( (p[n] & 0xc0)
237d0 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20  ==0x80 ) n++;.  
237e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
237f0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
23800 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
23810 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
23820 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
23830 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
23840 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
23850 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
23860 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
23870 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
23880 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Charlen(const ch
23890 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
238a0 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d  ){.  int nChar =
238b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a   0;            .
238c0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77    int i = 0;.  w
238d0 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20  hile( i<nIn ){. 
238e0 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
238f0 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d   char)pIn[i++]>=
23900 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
23910 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70  ile( i<nIn && (p
23920 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30  In[i] & 0xc0)==0
23930 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d  x80 ) i++;.    }
23940 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20  .    nChar++;.  
23950 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72  }.  return nChar
23960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
23970 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
23980 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
23990 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
239a0 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
239b0 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
239c0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
239d0 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
239e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
239f0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
23a00 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
23a10 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
23a20 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
23a30 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
23a40 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
23a50 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
23a60 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
23a70 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
23a80 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
23a90 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
23aa0 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
23ab0 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
23ac0 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
23ad0 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
23ae0 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
23af0 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
23b00 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
23b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23b20 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a  Fts5IndexWrite(.
23b30 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
23b60 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
23b70 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
23b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23b90 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
23ba0 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
23bb0 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
23bc0 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
23be0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
23bf0 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
23c00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23c10 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
23c20 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
23c30 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
23c40 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
23c50 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
23c80 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
23c90 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
23ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23cb0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
23cc0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23cd0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
23ce0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
23cf0 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fig;..  assert( 
23d00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
23d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69   );.  assert( (i
23d20 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65  Col<0)==p->bDele
23d30 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  te );..  /* Add 
23d40 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
23d50 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65   main terms inde
23d60 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  x. */.  rc = sql
23d70 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
23d80 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73  e(.      p->pHas
23d90 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  h, p->iWriteRowi
23da0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
23db0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c  TS5_MAIN_PREFIX,
23dc0 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a   pToken, nToken.
23dd0 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b    );..  for(i=0;
23de0 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   i<pConfig->nPre
23df0 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  fix && rc==SQLIT
23e00 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
23e10 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61 72 20  const int nChar 
23e20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  = pConfig->aPref
23e30 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  ix[i];.    int n
23e40 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74  Byte = sqlite3Ft
23e50 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
23e60 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20  Bytelen(pToken, 
23e70 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b 0a  nToken, nChar);.
23e80 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
23e90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23ea0 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74 65  te3Fts5HashWrite
23eb0 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20 20  (p->pHash, .    
23ec0 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 52        p->iWriteR
23ed0 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
23ee0 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f 4d 41  , (char)(FTS5_MA
23ef0 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c 20  IN_PREFIX+i+1), 
23f00 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20  pToken,.        
23f10 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b    nByte.      );
23f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
23f30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23f40 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
23f50 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
23f60 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69   though all rowi
23f70 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  d that match the
23f80 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
23f90 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
23fa0 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
23fb0 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
23fc0 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
23fd0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
23fe0 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
23ff0 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
24000 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
24010 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
24020 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
24030 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
24040 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
24050 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
24060 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
24070 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
24080 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
24090 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
240a0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
240b0 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20 63  /* Match these c
240c0 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20  olumns only */. 
240d0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
240e0 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
240f0 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
24100 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
24110 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
24120 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
24130 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64  onfig;.  Fts5Ind
24140 65 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30  exIter *pRet = 0
24150 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
24160 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
24170 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  uf = {0, 0, 0};.
24180 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45  .  /* If the QUE
24190 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20  RY_SCAN flag is 
241a0 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66  set, all other f
241b0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65  lags must be cle
241c0 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ar. */.  assert(
241d0 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
241e0 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d  DEX_QUERY_SCAN)=
241f0 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53  =0 || flags==FTS
24200 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
24210 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  N );..  if( sqli
24220 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
24230 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  e(&p->rc, &buf, 
24240 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a  nToken+1)==0 ){.
24250 20 20 20 20 6d 65 6d 63 70 79 28 26 62 75 66 2e      memcpy(&buf.
24260 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  p[1], pToken, nT
24270 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20 53  oken);..#ifdef S
24280 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
24290 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  /* If the QUERY_
242a0 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20  TEST_NOIDX flag 
242b0 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
242c0 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65  hen this must be
242d0 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78   a.    ** prefix
242e0 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20  -query. Instead 
242f0 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66 69  of using a prefi
24300 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20  x-index (if one 
24310 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a  exists), .    **
24320 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70 72   evaluate the pr
24330 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e 67  efix query using
24340 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e   the main FTS in
24350 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73 65  dex. This is use
24360 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74  d.    ** for int
24370 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ernal sanity che
24380 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74  cking by the int
24390 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20  egrity-check in 
243a0 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f  debug .    ** mo
243b0 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  de only.  */.   
243c0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50   if( pConfig->bP
243d0 72 65 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c  refixIndex==0 ||
243e0 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
243f0 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
24400 4f 49 44 58 29 20 29 7b 0a 20 20 20 20 20 20 61  OIDX) ){.      a
24410 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 46  ssert( flags & F
24420 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
24430 52 45 46 49 58 20 29 3b 0a 20 20 20 20 20 20 69  REFIX );.      i
24440 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d  Idx = 1+pConfig-
24450 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20 20 7d 65  >nPrefix;.    }e
24460 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
24470 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
24480 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
24490 58 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  X ){.      int n
244a0 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78  Char = fts5Index
244b0 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20  Charlen(pToken, 
244c0 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66  nToken);.      f
244d0 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c  or(iIdx=1; iIdx<
244e0 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
244f0 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20  x; iIdx++){.    
24500 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
24510 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d  >aPrefix[iIdx-1]
24520 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b  ==nChar ) break;
24530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24540 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70 43      if( iIdx<=pC
24550 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29  onfig->nPrefix )
24560 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
24570 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
24580 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24590 61 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75 66  ad(p);.      buf
245a0 2e 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54 53  .p[0] = (u8)(FTS
245b0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
245c0 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  iIdx);.      if(
245d0 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
245e0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
245f0 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
24600 20 31 2c 20 66 6c 61 67 73 2c 20 62 75 66 2e 70   1, flags, buf.p
24610 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20  , nToken+1, -1, 
24620 30 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20  0, &pRet);.     
24630 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24640 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
24650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
24660 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
24670 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  Desc = (flags & 
24680 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
24690 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  DESC)!=0;.      
246a0 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
246b0 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20  MAIN_PREFIX;.   
246c0 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
246d0 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
246e0 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
246f0 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74  , pColset, &pRet
24700 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
24710 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
24720 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
24730 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a 20 20 20  Close(pRet);.   
24740 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
24750 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
24760 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  er(p);.    }.   
24770 20 2a 70 70 49 74 65 72 20 3d 20 70 52 65 74 3b   *ppIter = pRet;
24780 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
24790 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
247a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
247b0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
247c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
247d0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
247e0 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
247f0 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
24800 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
24810 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
24820 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  5IterEof(Fts5Ind
24830 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
24840 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
24850 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
24860 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
24870 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
24880 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
24890 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
248a0 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e  ng rowid. .*/.in
248b0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
248c0 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49  rNext(Fts5IndexI
248d0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
248e0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
248f0 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ndex->rc==SQLITE
24900 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c  _OK );.  fts5Mul
24910 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  tiIterNext(pIter
24920 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c  ->pIndex, pIter,
24930 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
24940 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
24950 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
24960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24970 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
24980 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20  ing term/rowid. 
24990 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  Used by the fts5
249a0 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f  vocab module..*/
249b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
249c0 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73  IterNextScan(Fts
249d0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
249e0 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r){.  Fts5Index 
249f0 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64  *p = pIter->pInd
24a00 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ex;..  assert( p
24a10 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
24a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
24a30 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
24a40 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
24a50 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63   0);.  if( p->rc
24a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24a70 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
24a80 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
24a90 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
24aa0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
24ab0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
24ac0 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72  eaf && pSeg->ter
24ad0 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49  m.p[0]!=FTS5_MAI
24ae0 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20  N_PREFIX ){.    
24af0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
24b00 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a  e(pSeg->pLeaf);.
24b10 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61        pSeg->pLea
24b20 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74  f = 0;.      pIt
24b30 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  er->bEof = 1;.  
24b40 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
24b50 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
24b60 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
24b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
24b80 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
24b90 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20  hing rowid that 
24ba0 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66 74  occurs at or aft
24bb0 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a  er iMatch. The.*
24bc0 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  * definition of 
24bd0 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64 65  "at or after" de
24be0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
24bf0 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69   this iterator i
24c00 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73  terates.** in as
24c10 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65  cending or desce
24c20 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
24c30 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
24c40 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
24c50 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  m(Fts5IndexIter 
24c60 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74  *pIter, i64 iMat
24c70 63 68 29 7b 0a 20 20 66 74 73 35 4d 75 6c 74 69  ch){.  fts5Multi
24c80 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74  IterNextFrom(pIt
24c90 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
24ca0 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65  r, iMatch);.  re
24cb0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
24cc0 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
24cd0 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ex);.}../*.** Re
24ce0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
24cf0 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73   rowid..*/.i64 s
24d00 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f  qlite3Fts5IterRo
24d10 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65  wid(Fts5IndexIte
24d20 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
24d30 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65  urn fts5MultiIte
24d40 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 7d  rRowid(pIter);.}
24d50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
24d60 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e  he current term.
24d70 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
24d80 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 54  sqlite3Fts5IterT
24d90 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  erm(Fts5IndexIte
24da0 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70  r *pIter, int *p
24db0 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  n){.  int n;.  c
24dc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
24dd0 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35  const char*)fts5
24de0 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
24df0 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20  ter, &n);.  *pn 
24e00 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20  = n-1;.  return 
24e10 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74 61 74 69  &z[1];.}...stati
24e20 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45  c int fts5IndexE
24e30 78 74 72 61 63 74 43 6f 6c 73 65 74 20 28 0a 20  xtractColset (. 
24e40 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
24e50 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
24e60 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69   /* Colset to fi
24e70 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  lter on */.  con
24e80 73 74 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74  st u8 *pPos, int
24e90 20 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20   nPos,       /* 
24ea0 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  Position list */
24eb0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
24ec0 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Buf             
24ed0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
24ee0 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fer */.){.  int 
24ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24f00 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35    int i;..  fts5
24f10 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29  BufferZero(pBuf)
24f20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
24f30 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b  Colset->nCol; i+
24f40 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38  +){.    const u8
24f50 20 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20   *pSub = pPos;. 
24f60 20 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 66 74     int nSub = ft
24f70 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
24f80 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70  l(&pSub, nPos, p
24f90 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d  Colset->aiCol[i]
24fa0 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 20  );.    if( nSub 
24fb0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
24fc0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
24fd0 63 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70  c, pBuf, nSub, p
24fe0 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sub);.    }.  }.
24ff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25000 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25010 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
25020 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
25030 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
25040 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a  ition list for.*
25050 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  * the current en
25060 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69  try. Output vari
25070 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20  able *pn is set 
25080 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
25090 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e  he buffer .** in
250a0 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 72 65   bytes before re
250b0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
250c0 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69  he returned posi
250d0 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e  tion list does n
250e0 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22  ot include the "
250f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22  number of bytes"
25100 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64   varint.** field
25110 20 74 68 61 74 20 73 74 61 72 74 73 20 74 68 65   that starts the
25120 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f   position list o
25130 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  n disk..*/.int s
25140 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
25150 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
25160 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  exIter *pIter, .
25170 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
25180 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
25190 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 69 6c 74    /* Column filt
251a0 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  er (or NULL) */.
251b0 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c    const u8 **pp,
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
251e0 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  r to position-li
251f0 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  st data */.  int
25200 20 2a 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20   *pn,           
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25220 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73  OUT: Size of pos
25230 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79  ition-list in by
25240 74 65 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69  tes */.  i64 *pi
25250 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
25260 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
25270 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
25280 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  /.){.  Fts5SegIt
25290 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
252a0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
252b0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
252c0 20 5d 3b 0a 20 20 69 6e 74 20 65 44 65 74 61 69   ];.  int eDetai
252d0 6c 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  l = pIter->pInde
252e0 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
252f0 61 69 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ail;..  assert( 
25300 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
25310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
25320 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 70 53 65    *piRowid = pSe
25330 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28  g->iRowid;.  if(
25340 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
25350 45 54 41 49 4c 5f 46 55 4c 4c 20 0a 20 20 20 26  ETAIL_FULL .   &
25360 26 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  & pSeg->iLeafOff
25370 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d  set+pSeg->nPos<=
25380 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
25390 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 75 38  eaf .  ){.    u8
253a0 20 2a 70 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e   *pPos = &pSeg->
253b0 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69  pLeaf->p[pSeg->i
253c0 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
253d0 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20   if( pColset==0 
253e0 7c 7c 20 70 49 74 65 72 2d 3e 62 46 69 6c 74 65  || pIter->bFilte
253f0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  red ){.      *pn
25400 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20   = pSeg->nPos;. 
25410 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b       *pp = pPos;
25420 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
25430 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20  Colset->nCol==1 
25440 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
25450 50 6f 73 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d  Pos;.      *pn =
25460 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
25470 74 43 6f 6c 28 70 70 2c 20 70 53 65 67 2d 3e 6e  tCol(pp, pSeg->n
25480 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69  Pos, pColset->ai
25490 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Col[0]);.    }el
254a0 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75  se{.      fts5Bu
254b0 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
254c0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
254d0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
254e0 74 43 6f 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c  tColset(pColset,
254f0 20 70 50 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f   pPos, pSeg->nPo
25500 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  s, &pIter->posli
25510 73 74 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  st);.      *pp =
25520 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
25530 70 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70  p;.      *pn = p
25540 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  Iter->poslist.n;
25550 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
25560 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
25570 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
25580 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  st);.    fts5Seg
25590 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
255a0 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
255b0 20 70 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72   pColset, &pIter
255c0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
255d0 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
255e0 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b  5_DETAIL_FULL ){
255f0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 49 74  .      *pp = pIt
25600 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
25610 20 20 20 7d 0a 20 20 20 20 2a 70 6e 20 3d 20 70     }.    *pn = p
25620 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  Iter->poslist.n;
25630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74  .  }.  return ft
25640 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
25650 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
25660 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25670 49 74 65 72 43 6f 6c 6c 69 73 74 28 0a 20 20 46  IterCollist(.  F
25680 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
25690 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
256a0 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
256b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
256c0 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74  Pointer to posit
256d0 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f  ion-list data */
256e0 0a 20 20 69 6e 74 20 2a 70 6e 20 20 20 20 20 20  .  int *pn      
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
25710 6f 66 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  of position-list
25720 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
25730 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
25740 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
25750 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
25760 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29  DETAIL_COLUMNS )
25770 3b 0a 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d  ;.  *pp = pIter-
25780 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 2a 70  >poslist.p;.  *p
25790 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  n = pIter->posli
257a0 73 74 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53  st.n;.  return S
257b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
257c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
257d0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
257e0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
257f0 73 6c 69 73 74 28 29 2c 20 65 78 63 65 70 74 20  slist(), except 
25800 74 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65  that it.** copie
25810 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
25820 69 73 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ist into the buf
25830 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
25840 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
25850 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
25860 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
25870 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73  oslistBuffer(Fts
25880 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
25890 72 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  r, Fts5Buffer *p
258a0 42 75 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  Buf){.  Fts5Inde
258b0 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
258c0 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 65 67 49  ndex;.  Fts5SegI
258d0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
258e0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
258f0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
25900 74 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t ];.  assert( p
25910 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
25920 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  );.  fts5BufferZ
25930 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 66 74 73  ero(pBuf);.  fts
25940 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
25950 70 2c 20 70 53 65 67 2c 20 30 2c 20 70 42 75 66  p, pSeg, 0, pBuf
25960 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
25970 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
25980 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
25990 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65  n iterator opene
259a0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
259b0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
259c0 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e  ts5IndexQuery().
259d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
259e0 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74  Fts5IterClose(Ft
259f0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
25a00 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
25a10 20 29 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65   ){.    Fts5Inde
25a20 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65  x *pIndex = pIte
25a30 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66  r->pIndex;.    f
25a40 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
25a50 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
25a60 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35  pIter);.    fts5
25a70 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64  CloseReader(pInd
25a80 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ex);.  }.}../*.*
25a90 2a 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64  * Read and decod
25aa0 65 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  e the "averages"
25ab0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
25ac0 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a   database. .**.*
25ad0 2a 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69  * Parameter anSi
25ae0 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ze must point to
25af0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a   an array of siz
25b00 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43  e nCol, where nC
25b10 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ol is.** the num
25b20 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69  ber of user defi
25b30 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ned columns in t
25b40 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f  he FTS table..*/
25b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25b60 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
25b70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
25b80 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a  64 *pnRow, i64 *
25b90 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e  anSize){.  int n
25ba0 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Col = p->pConfig
25bb0 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61  ->nCol;.  Fts5Da
25bc0 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70  ta *pData;..  *p
25bd0 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  nRow = 0;.  mems
25be0 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69  et(anSize, 0, si
25bf0 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c  zeof(i64) * nCol
25c00 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73  );.  pData = fts
25c10 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
25c20 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
25c30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
25c40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
25c50 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e  ta->nn ){.    in
25c60 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
25c70 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20   iCol;.    i += 
25c80 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
25c90 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34  Data->p[i], (u64
25ca0 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f  *)pnRow);.    fo
25cb0 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74  r(iCol=0; i<pDat
25cc0 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43  a->nn && iCol<nC
25cd0 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
25ce0 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
25cf0 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
25d00 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a  i], (u64*)&anSiz
25d10 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a  e[iCol]);.    }.
25d20 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52    }..  fts5DataR
25d30 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
25d40 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
25d50 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
25d60 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
25d70 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67   current "averag
25d80 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20  es" record with 
25d90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25da0 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73  the buffer .** s
25db0 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73  upplied as the s
25dc0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
25dd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
25de0 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67  s5IndexSetAverag
25df0 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
25e00 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
25e10 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
25e20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
25e30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
25e40 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
25e50 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
25e60 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ID, pData, nData
25e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
25e80 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
25e90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25ea0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
25eb0 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20   of blocks this 
25ec0 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20  module has read 
25ed0 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a  from the %_data.
25ee0 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69  ** table since i
25ef0 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
25f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
25f10 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35  5IndexReads(Fts5
25f20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74  Index *p){.  ret
25f30 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a  urn p->nRead;.}.
25f40 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33  ./*.** Set the 3
25f50 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c  2-bit cookie val
25f60 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  ue stored at the
25f70 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74   start of all st
25f80 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f  ructure .** reco
25f90 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65  rds to the value
25fa0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
25fb0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
25fc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
25fd0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
25fe0 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
25ff0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
26000 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
26010 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
26020 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43  te3Fts5IndexSetC
26030 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20  ookie(Fts5Index 
26040 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20  *p, int iNew){. 
26050 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
26080 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
26090 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
260a0 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f  p->pConfig;    /
260b0 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
260c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61  object */.  u8 a
260d0 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20  Cookie[4];      
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65   /* Binary repre
26100 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65  sentation of iNe
26110 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  w */.  sqlite3_b
26120 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a  lob *pBlob = 0;.
26130 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
26140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
26150 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33   sqlite3Fts5Put3
26160 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29  2(aCookie, iNew)
26170 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
26180 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
26190 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67  fig->db, pConfig
261a0 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
261b0 62 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63  bl, .      "bloc
261c0 6b 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  k", FTS5_STRUCTU
261d0 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42  RE_ROWID, 1, &pB
261e0 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  lob.  );.  if( r
261f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26200 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
26210 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43  _write(pBlob, aC
26220 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20  ookie, 4, 0);.  
26230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
26240 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29  lob_close(pBlob)
26250 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
26260 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
26270 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43  e3Fts5IndexLoadC
26280 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20  onfig(Fts5Index 
26290 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
262a0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
262b0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
262c0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
262d0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
262e0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
262f0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
26300 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
26310 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
26320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
26360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
263b0 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
263c0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
263d0 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72  on of the integr
263e0 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75  ity-check .** fu
263f0 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a  nctionality..*/.
26400 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
26410 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20  simple checksum 
26420 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74  value based on t
26430 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  he arguments..*/
26440 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .u64 sqlite3Fts5
26450 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
26460 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a  .  i64 iRowid, .
26470 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69    int iCol, .  i
26480 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20  nt iPos, .  int 
26490 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  iIdx,.  const ch
264a0 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74  ar *pTerm,.  int
264b0 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20   nTerm.){.  int 
264c0 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69  i;.  u64 ret = i
264d0 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20  Rowid;.  ret += 
264e0 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b  (ret<<3) + iCol;
264f0 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
26500 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28  3) + iPos;.  if(
26510 20 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b   iIdx>=0 ) ret +
26520 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54  = (ret<<3) + (FT
26530 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b  S5_MAIN_PREFIX +
26540 20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d   iIdx);.  for(i=
26550 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
26560 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
26570 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72   + pTerm[i];.  r
26580 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69  eturn ret;.}..#i
26590 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
265a0 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
265b0 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20  ction is purely 
265c0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
265d0 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
265e0 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
265f0 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
26600 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
26610 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
26620 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
26630 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65  * Instead, it te
26640 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d  sts that the sam
26650 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f  e set of pgno/ro
26660 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  wid combinations
26670 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64   are .** visited
26680 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
26690 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69  hether the docli
266a0 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66  st-index identif
266b0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
266c0 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61  s.** iSegid/iLea
266d0 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e  f is iterated in
266e0 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76   forwards or rev
266f0 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  erse order..*/.s
26700 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
26710 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
26720 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
26730 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20   .  int iSegid, 
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
26760 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a  d to load from *
26770 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20  /.  int iLeaf   
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26790 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c      /* Load docl
267a0 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
267b0 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20  is leaf */.){.  
267c0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
267d0 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34  Dlidx = 0;.  u64
267e0 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20   cksum1 = 13;.  
267f0 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b  u64 cksum2 = 13;
26800 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66  ..  for(pDlidx=f
26810 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
26820 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69  (p, 0, iSegid, i
26830 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73  Leaf);.      fts
26840 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
26850 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
26860 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
26870 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
26880 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f    ){.    i64 iRo
26890 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49  wid = fts5DlidxI
268a0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
268b0 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  ;.    int pgno =
268c0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
268d0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
268e0 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65  assert( pgno>iLe
268f0 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31  af );.    cksum1
26900 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
26910 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
26920 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
26930 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
26940 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
26950 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
26960 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
26970 31 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  1, iSegid, iLeaf
26980 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
26990 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
269a0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
269b0 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
269c0 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
269d0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
269e0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
269f0 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
26a00 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
26a10 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
26a20 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
26a30 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  rt( fts5DlidxIte
26a40 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c  rPgno(pDlidx)>iL
26a50 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
26a60 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28  2 += iRowid + ((
26a70 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20  i64)pgno<<32);. 
26a80 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
26a90 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
26aa0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
26ab0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
26ac0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21  TE_OK && cksum1!
26ad0 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
26ae0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26af0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
26b00 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20  s5QueryCksum(.  
26b10 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62  /* Fts5 index ob
26b40 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
26b50 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
26b60 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20   *z,            
26b70 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b        /* Index k
26b80 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  ey to query for 
26b90 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26bc0 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74  index key in byt
26bd0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  es */.  int flag
26be0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
26bf0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
26c00 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75   for Fts5IndexQu
26c10 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43  ery */.  u64 *pC
26c20 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20  ksum            
26c30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
26c40 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c  UT: Checksum val
26c50 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63  ue */.){.  u64 c
26c60 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a  ksum = *pCksum;.
26c70 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
26c80 2a 70 49 64 78 49 74 65 72 20 3d 20 30 3b 0a 20  *pIdxIter = 0;. 
26c90 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
26ca0 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 69  = {0, 0, 0};.  i
26cb0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  nt rc = sqlite3F
26cc0 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c  ts5IndexQuery(p,
26cd0 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c   z, n, flags, 0,
26ce0 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20   &pIdxIter);..  
26cf0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
26d00 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
26d10 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
26d20 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69  dxIter) ){.    i
26d30 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74  64 rowid = sqlit
26d40 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28  e3Fts5IterRowid(
26d50 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20 72  pIdxIter);.    r
26d60 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
26d70 74 65 72 50 6f 73 6c 69 73 74 42 75 66 66 65 72  terPoslistBuffer
26d80 28 70 49 64 78 49 74 65 72 2c 20 26 62 75 66 29  (pIdxIter, &buf)
26d90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26db0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
26dc0 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
26dd0 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
26de0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
26df0 69 74 28 62 75 66 2e 70 2c 20 62 75 66 2e 6e 2c  it(buf.p, buf.n,
26e00 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20   &sReader);.    
26e10 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62 45        sReader.bE
26e20 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  of==0;.         
26e30 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26e40 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 73  istReaderNext(&s
26e50 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b  Reader).      ){
26e60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
26e70 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  l = FTS5_POS2COL
26e80 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73  UMN(sReader.iPos
26e90 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
26ea0 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f  Off = FTS5_POS2O
26eb0 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69 50  FFSET(sReader.iP
26ec0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  os);.        cks
26ed0 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  um ^= sqlite3Fts
26ee0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
26ef0 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f  (rowid, iCol, iO
26f00 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b  ff, iIdx, z, n);
26f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
26f20 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
26f30 74 65 72 4e 65 78 74 28 70 49 64 78 49 74 65 72  terNext(pIdxIter
26f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
26f50 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
26f60 6f 73 65 28 70 49 64 78 49 74 65 72 29 3b 0a 20  ose(pIdxIter);. 
26f70 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
26f80 26 62 75 66 29 3b 0a 0a 20 20 2a 70 43 6b 73 75  &buf);..  *pCksu
26f90 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74  m = cksum;.  ret
26fa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
26fb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26fc0 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61  is also purely a
26fd0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
26fe0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
26ff0 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
27000 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
27010 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
27020 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
27030 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74  n any way..*/.st
27040 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65  atic void fts5Te
27050 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  stTerm(.  Fts5In
27060 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42  dex *p, .  Fts5B
27070 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20  uffer *pPrev,   
27080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
27090 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20  evious term */. 
270a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
270b0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
270c0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77   /* Possibly new
270d0 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f   term to test */
270e0 0a 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c  .  u64 expected,
270f0 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29  .  u64 *pCksum.)
27100 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
27110 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d  rc;.  if( pPrev-
27120 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  >n==0 ){.    fts
27130 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
27140 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
27150 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65   u8*)z);.  }else
27160 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27170 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e  E_OK && (pPrev->
27180 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  n!=n || memcmp(p
27190 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20  Prev->p, z, n)) 
271a0 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d  ){.    u64 cksum
271b0 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20  3 = *pCksum;.   
271c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
271d0 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rm = (const char
271e0 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20  *)&pPrev->p[1]; 
271f0 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72   /* term sans pr
27200 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20  efix-byte */.   
27210 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72   int nTerm = pPr
27220 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20  ev->n-1;        
27230 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
27240 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
27250 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20  .    int iIdx = 
27260 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46  (pPrev->p[0] - F
27270 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29  TS5_MAIN_PREFIX)
27280 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
27290 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a  = (iIdx==0 ? 0 :
272a0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
272b0 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36  _PREFIX);.    u6
272c0 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75  4 ck1 = 0;.    u
272d0 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20  64 ck2 = 0;..   
272e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
272f0 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72  he results retur
27300 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20  ned for ASC and 
27310 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65  DESC queries are
27320 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
27330 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74  . If not, call t
27340 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  his corruption. 
27350 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
27360 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
27370 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
27380 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b  m, flags, &ck1);
27390 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
273a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
273b0 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
273c0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
273d0 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  SC;.      rc = f
273e0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
273f0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
27400 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
27410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
27420 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
27430 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
27440 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20  S5_CORRUPT;..   
27450 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
27460 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63   prefix query, c
27470 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65  heck that the re
27480 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69  sults returned i
27490 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  f the.    ** the
274a0 20 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c   index is disabl
274b0 65 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ed are the same.
274c0 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64   In both ASC and
274d0 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20   DESC order. .  
274e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
274f0 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20   check may only 
27500 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
27510 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  the hash table i
27520 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20  s empty. This.  
27530 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20    ** is because 
27540 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f  the hash table o
27550 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20 73  nly supports a s
27560 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79  ingle scan query
27570 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d   at.    ** a tim
27580 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69  e, and the multi
27590 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20  -iter loop from 
275a0 77 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74  which this funct
275b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  ion is called.  
275c0 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
275d0 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20  performing such 
275e0 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69  a scan. */.    i
275f0 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  f( p->nPendingDa
27600 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ta==0 ){.      i
27610 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d  f( iIdx>0 && rc=
27620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27630 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
27640 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  ags|FTS5INDEX_QU
27650 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a  ERY_TEST_NOIDX;.
27660 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b          ck2 = 0;
27670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
27680 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
27690 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
276a0 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
276b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
276c0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
276d0 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
276e0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
276f0 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e  .      if( iIdx>
27700 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
27710 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
27720 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
27730 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
27740 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58  _NOIDX|FTS5INDEX
27750 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20  _QUERY_DESC;.   
27760 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20       ck2 = 0;.  
27770 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
27780 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
27790 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
277a0 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20   f, &ck2);.     
277b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
277c0 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
277d0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
277e0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
277f0 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20    }..    cksum3 
27800 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35  ^= ck1;.    fts5
27810 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70  BufferSet(&rc, p
27820 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  Prev, n, (const 
27830 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28  u8*)z);..    if(
27840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
27850 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74  & cksum3!=expect
27860 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
27870 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
27880 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d     }.    *pCksum
27890 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20   = cksum3;.  }. 
278a0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20   p->rc = rc;.}. 
278b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
278c0 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
278d0 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65  erse(x,y,z).# de
278e0 66 69 6e 65 20 66 74 73 35 54 65 73 74 54 65 72  fine fts5TestTer
278f0 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  m(u,v,w,x,y,z).#
27900 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
27910 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ck that:.**.**  
27920 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f   1) All leaves o
27930 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69  f pSeg between i
27940 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20  First and iLast 
27950 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73  (inclusive) exis
27960 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f  t and.**      co
27970 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73  ntain zero terms
27980 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65  ..**   2) All le
27990 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74  aves of pSeg bet
279a0 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e  ween iNoRowid an
279b0 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69  d iLast (inclusi
279c0 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a  ve) exist and.**
279d0 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65        contain ze
279e0 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74  ro rowids..*/.st
279f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
27a00 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
27a10 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e  kEmpty(.  Fts5In
27a20 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74  dex *p,.  Fts5St
27a30 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
27a40 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67  pSeg,     /* Seg
27a50 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e  ment to check in
27a60 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e  ternal consisten
27a70 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  cy */.  int iFir
27a80 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77  st,.  int iNoRow
27a90 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a  id,.  int iLast.
27aa0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
27ab0 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  * Now check that
27ac0 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79   the iter.nEmpty
27ad0 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
27ae0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  g the current le
27af0 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73  af.  ** (a) exis
27b00 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
27b10 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20  n no terms. */. 
27b20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70   for(i=iFirst; p
27b30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27b40 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b  && i<=iLast; i++
27b50 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
27b60 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74  *pLeaf = fts5Dat
27b70 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
27b80 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
27b90 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20  ->iSegid, i));. 
27ba0 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
27bb0 20 20 20 20 20 20 69 66 28 20 21 66 74 73 35 4c        if( !fts5L
27bc0 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
27bd0 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  eaf) ) p->rc = F
27be0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
27bf0 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77     if( i>=iNoRow
27c00 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61  id && 0!=fts5Lea
27c10 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
27c20 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20  Leaf) ) p->rc = 
27c30 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27c40 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61    }.    fts5Data
27c50 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
27c60 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
27c70 69 64 20 66 74 73 35 49 6e 74 65 67 72 69 74 79  id fts5Integrity
27c80 43 68 65 63 6b 50 67 69 64 78 28 46 74 73 35 49  CheckPgidx(Fts5I
27c90 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74  ndex *p, Fts5Dat
27ca0 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74  a *pLeaf){.  int
27cb0 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20   iTermOff = 0;. 
27cc0 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35   int ii;..  Fts5
27cd0 42 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30  Buffer buf1 = {0
27ce0 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66  ,0,0};.  Fts5Buf
27cf0 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c  fer buf2 = {0,0,
27d00 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61  0};..  ii = pLea
27d10 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69  f->szLeaf;.  whi
27d20 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e  le( ii<pLeaf->nn
27d30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
27d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
27d50 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  res;.    int iOf
27d60 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72  f;.    int nIncr
27d70 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73  ;..    ii += fts
27d80 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
27d90 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63  eaf->p[ii], nInc
27da0 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66  r);.    iTermOff
27db0 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69   += nIncr;.    i
27dc0 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
27dd0 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  .    if( iOff>=p
27de0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
27df0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
27e00 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
27e10 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
27e20 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20  ff==nIncr ){.   
27e30 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
27e40 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
27e50 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
27e60 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79  af->p[iOff], nBy
27e70 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  te);.      if( (
27e80 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61  iOff+nByte)>pLea
27e90 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
27ea0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
27eb0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
27ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27ed0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
27ee0 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79  ->rc, &buf1, nBy
27ef0 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  te, &pLeaf->p[iO
27f00 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ff]);.      }.  
27f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
27f20 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b  nt nKeep, nByte;
27f30 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
27f40 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
27f50 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
27f60 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f  nKeep);.      iO
27f70 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
27f80 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
27f90 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
27fa0 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62       if( nKeep>b
27fb0 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e  uf1.n || (iOff+n
27fc0 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Byte)>pLeaf->szL
27fd0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
27fe0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
27ff0 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
28000 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e  {.        buf1.n
28010 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20   = nKeep;.      
28020 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
28030 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
28040 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c  buf1, nByte, &pL
28050 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20  eaf->p[iOff]);. 
28060 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
28070 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
28080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
28090 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
280a0 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26 62 75  mpare(&buf1, &bu
280b0 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f2);.        if(
280c0 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20   res<=0 ) p->rc 
280d0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
280e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
280f0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
28100 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62  &p->rc, &buf2, b
28110 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a  uf1.n, buf1.p);.
28120 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65    }..  fts5Buffe
28130 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20  rFree(&buf1);.  
28140 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
28150 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  buf2);.}..static
28160 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49   void fts5IndexI
28170 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67  ntegrityCheckSeg
28180 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65  ment(.  Fts5Inde
28190 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
281a0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
281b0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
281c0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
281d0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20  eSegment *pSeg  
281e0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
281f0 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c  o check internal
28200 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a   consistency */.
28210 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
28220 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
28230 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33  onfig;.  sqlite3
28240 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
28250 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69  ;.  int rc2;.  i
28260 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61 66 20  nt iIdxPrevLeaf 
28270 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
28280 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64  t-1;.  int iDlid
28290 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
282a0 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69  ->pgnoLast;..  i
282b0 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  f( pSeg->pgnoFir
282c0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
282d0 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70  .  fts5IndexPrep
282e0 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d  areStmt(p, &pStm
282f0 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  t, sqlite3_mprin
28300 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43  tf(.      "SELEC
28310 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28  T segid, term, (
28320 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26  pgno>>1), (pgno&
28330 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69  1) FROM %Q.'%q_i
28340 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d  dx' WHERE segid=
28350 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66  %d",.      pConf
28360 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
28370 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69  ->zName, pSeg->i
28380 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f  Segid.  ));..  /
28390 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
283a0 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  h the b-tree hie
283b0 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68  rarchy.  */.  wh
283c0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
283d0 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
283e0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
283f0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
28400 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20  i64 iRow;       
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28420 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
28430 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35  leaf */.    Fts5
28440 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20  Data *pLeaf;    
28450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
28460 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  a for this leaf 
28470 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78  */..    int nIdx
28480 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  Term = sqlite3_c
28490 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
284a0 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74  t, 1);.    const
284b0 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20   char *zIdxTerm 
284c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
284d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
284e0 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
284f0 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d    int iIdxLeaf =
28500 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28510 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20  int(pStmt, 2);. 
28520 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78     int bIdxDlidx
28530 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
28540 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b  n_int(pStmt, 3);
28550 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
28560 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e  leaf in question
28570 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
28580 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74  n trimmed from t
28590 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20  he segment, .   
285a0 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20   ** ignore this 
285b0 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74  b-tree entry. Ot
285c0 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74  herwise, load it
285d0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f   into memory. */
285e0 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61  .    if( iIdxLea
285f0 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
28600 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
28610 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
28620 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
28630 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65  ->iSegid, iIdxLe
28640 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d  af);.    pLeaf =
28650 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
28660 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20   iRow);.    if( 
28670 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
28680 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
28690 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f  that the leaf co
286a0 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
286b0 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68  one term, and th
286c0 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20  at it is equal. 
286d0 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67     ** to or larg
286e0 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69  er than the spli
286f0 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72  t-key in zIdxTer
28700 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74  m.  Also check t
28710 68 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20  hat if there.   
28720 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f   ** is also a ro
28730 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68  wid pointer with
28740 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  in the leaf page
28750 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e   header, it poin
28760 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c  ts to a.    ** l
28770 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74  ocation before t
28780 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20  he term.  */.   
28790 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d   if( pLeaf->nn<=
287a0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
287b0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
287c0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
287d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
287e0 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t iOff;         
287f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
28800 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72  set of first ter
28810 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20  m on leaf */.   
28820 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
28830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28840 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
28850 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20  t rowid on leaf 
28860 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  */.      int nTe
28870 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
28880 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
28890 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20  term on leaf in 
288a0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  bytes */.      i
288b0 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
288c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
288d0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d  mparison of term
288e0 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a   and split-key *
288f0 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  /..      iOff = 
28900 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
28910 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20  mOff(pLeaf);.   
28920 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
28930 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
28940 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20  dOff(pLeaf);.   
28950 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
28960 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  >=iOff ){.      
28970 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
28980 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
28990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  lse{.        iOf
289a0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
289b0 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
289c0 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Off], nTerm);.  
289d0 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
289e0 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  mp(&pLeaf->p[iOf
289f0 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49  f], zIdxTerm, MI
28a00 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72  N(nTerm, nIdxTer
28a10 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m));.        if(
28a20 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
28a30 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d  nTerm - nIdxTerm
28a40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
28a50 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  s<0 ) p->rc = FT
28a60 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
28a70 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49    }..      fts5I
28a80 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69  ntegrityCheckPgi
28a90 64 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20  dx(p, pLeaf);.  
28aa0 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61    }.    fts5Data
28ab0 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
28ac0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
28ad0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e  break;..    /* N
28ae0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
28af0 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65  e iter.nEmpty le
28b00 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  aves following t
28b10 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a  he current leaf.
28b20 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74      ** (a) exist
28b30 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
28b40 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20   no terms. */.  
28b50 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67    fts5IndexInteg
28b60 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a  rityCheckEmpty(.
28b70 20 20 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c          p, pSeg,
28b80 20 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c   iIdxPrevLeaf+1,
28b90 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b   iDlidxPrevLeaf+
28ba0 31 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20  1, iIdxLeaf-1.  
28bb0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e    );.    if( p->
28bc0 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  rc ) break;..   
28bd0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
28be0 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c  a doclist-index,
28bf0 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c   check that it l
28c00 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20  ooks right. */. 
28c10 20 20 20 69 66 28 20 62 49 64 78 44 6c 69 64 78     if( bIdxDlidx
28c20 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c   ){.      Fts5Dl
28c30 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
28c40 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65  = 0;  /* For ite
28c50 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64  rating through d
28c60 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
28c70 20 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c        int iPrevL
28c80 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a  eaf = iIdxLeaf;.
28c90 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64        int iSegid
28ca0 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b   = pSeg->iSegid;
28cb0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d  .      int iPg =
28cc0 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b   0;.      i64 iK
28cd0 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  ey;..      for(p
28ce0 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
28cf0 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53  terInit(p, 0, iS
28d00 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b  egid, iIdxLeaf);
28d10 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
28d20 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
28d30 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
28d40 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
28d50 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
28d60 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20  ).      ){..    
28d70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79      /* Check any
28d80 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65   rowid-less page
28d90 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
28da0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
28db0 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20  leaf. */.       
28dc0 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65   for(iPg=iPrevLe
28dd0 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c  af+1; iPg<fts5Dl
28de0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
28df0 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  dx); iPg++){.   
28e00 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
28e10 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
28e20 28 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20  (iSegid, iPg);. 
28e30 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d           pLeaf =
28e40 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
28e50 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   iKey);.        
28e60 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
28e70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
28e80 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
28e90 64 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29  dOff(pLeaf)!=0 )
28ea0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
28eb0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
28ec0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
28ed0 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
28ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28ef0 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65  .        iPrevLe
28f00 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  af = fts5DlidxIt
28f10 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
28f20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
28f30 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
28f40 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
28f50 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
28f60 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
28f70 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
28f80 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
28f90 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
28fa0 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
28fb0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
28fc0 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 72 65  WID(iSegid, iPre
28fd0 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  vLeaf);.        
28fe0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
28ff0 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
29000 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
29010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36   ){.          i6
29020 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  4 iRowid;.      
29030 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
29040 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
29050 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
29060 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45  ;.          ASSE
29070 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
29080 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  af);.          i
29090 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c  f( iRowidOff>=pL
290a0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
290b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
290c0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
290d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
290e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
290f0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
29100 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d  af->p[iRowidOff]
29110 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
29120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29130 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c  ( iRowid!=fts5Dl
29140 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
29150 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  idx) ) p->rc = F
29160 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
29170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29180 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
29190 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
291a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
291b0 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
291c0 61 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20  af = iPg;.      
291d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
291e0 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  e(pDlidx);.     
291f0 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
29200 76 65 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c  verse(p, iSegid,
29210 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20   iIdxLeaf);.    
29220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c  }else{.      iDl
29230 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  idxPrevLeaf = pS
29240 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  eg->pgnoLast;.  
29250 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
29260 63 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ck there is no d
29270 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
29280 20 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50      }..    iIdxP
29290 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65  revLeaf = iIdxLe
292a0 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d  af;.  }..  rc2 =
292b0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
292c0 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
292d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
292e0 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a   ) p->rc = rc2;.
292f0 0a 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e  .  /* Page iter.
29300 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62  iLeaf must now b
29310 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  e the rightmost 
29320 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65  leaf-page in the
29330 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20   segment */.#if 
29340 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  0.  if( p->rc==S
29350 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72  QLITE_OK && iter
29360 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67  .iLeaf!=pSeg->pg
29370 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
29380 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
29390 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  PT;.  }.#endif.}
293a0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74  .../*.** Run int
293b0 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20  ernal checks to 
293c0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
293d0 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73  FTS index (a) is
293e0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20   internally .** 
293f0 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28  consistent and (
29400 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  b) contains entr
29410 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  ies for which th
29420 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65  e XOR of the che
29430 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c  cksums.** as cal
29440 63 75 6c 61 74 65 64 20 62 79 20 73 71 6c 69 74  culated by sqlit
29450 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
29460 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d  Cksum() is cksum
29470 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
29480 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
29490 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65   any of the inte
294a0 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c  rnal checks fail
294b0 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63  , or if the.** c
294c0 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
294d0 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53   match. Return S
294e0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20  QLITE_OK if all 
294f0 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68  checks pass with
29500 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72  out.** error, or
29510 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69   some other SQLi
29520 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
29530 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28   another error (
29540 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63  e.g. OOM).** occ
29550 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
29560 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
29570 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
29580 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73  ndex *p, u64 cks
29590 75 6d 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d  um){.  u64 cksum
295a0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
295b0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
295c0 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
295d0 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
295e0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
295f0 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30  poslist = {0,0,0
29600 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75  };   /* Buffer u
29610 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f  sed to hold a po
29620 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49  slist */.  Fts5I
29630 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b  ndexIter *pIter;
29640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
29650 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
29660 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64  rough entire ind
29670 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ex */.  Fts5Stru
29680 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20  cture *pStruct; 
29690 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
296a0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23   structure */..#
296b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
296c0 55 47 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20  UG.  /* Used by 
296d0 65 78 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74  extra internal t
296e0 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66  ests only run if
296f0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
29700 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20  efined */.  u64 
29710 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20  cksum3 = 0;     
29720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
29730 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
29740 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64   contents of ind
29750 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75  exes */.  Fts5Bu
29760 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30  ffer term = {0,0
29770 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66  ,0};      /* Buf
29780 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64  fer used to hold
29790 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72   most recent ter
297a0 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 0a 20  m */.#endif.  . 
297b0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53   /* Load the FTS
297c0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
297d0 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20   */.  pStruct = 
297e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
297f0 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  d(p);..  /* Chec
29800 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72  k that the inter
29810 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63  nal nodes of eac
29820 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20  h segment match 
29830 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  the leaves */.  
29840 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
29850 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
29860 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  g;.    for(iLvl=
29870 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
29880 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
29890 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  {.      for(iSeg
298a0 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
298b0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
298c0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
298d0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
298e0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
298f0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
29900 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
29910 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74  Seg];.        ft
29920 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
29930 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20  CheckSegment(p, 
29940 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSeg);.      }. 
29950 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
29960 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e  he cksum argumen
29970 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
29980 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
29990 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
299a0 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e  ed.  ** based on
299b0 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e   all expected en
299c0 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53  tries in the FTS
299d0 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e   index (includin
299e0 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20  g prefix index. 
299f0 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68   ** entries). Th
29a00 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20  is block checks 
29a10 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20  that a checksum 
29a20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
29a30 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   on the.  ** act
29a40 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ual contents of 
29a50 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64 65  FTS index is ide
29a60 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ntical..  **.  *
29a70 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
29a80 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b  f the same check
29a90 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74  sum are calculat
29aa0 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28 73  ed. The first (s
29ab0 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62  tack.  ** variab
29ac0 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64  le cksum2) based
29ad0 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72   on entries extr
29ae0 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
29af0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20  ull-text index. 
29b00 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20   ** while doing 
29b10 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  a linear scan of
29b20 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
29b30 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20   index in turn. 
29b40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61  .  **.  ** As ea
29b50 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64 20  ch term visited 
29b60 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63  by the linear sc
29b70 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65 20  ans, a separate 
29b80 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20  query for the.  
29b90 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20  ** same term is 
29ba0 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d  performed. cksum
29bb0 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  3 is calculated 
29bc0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74  based on the ent
29bd0 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63  ries.  ** extrac
29be0 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75 65  ted by these que
29bf0 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ries..  */.  for
29c00 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
29c10 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c  w(p, pStruct, 0,
29c20 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c   0, 0, 0, -1, 0,
29c30 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20   &pIter);.      
29c40 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
29c50 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20  (p, pIter)==0;. 
29c60 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
29c70 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
29c80 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20   0, 0).  ){.    
29c90 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
29cb0 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
29cc0 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20  ytes */.    i64 
29cd0 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20  iPos = 0;       
29ce0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
29cf0 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f  ion read from po
29d00 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  slist */.    int
29d10 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20   iOff = 0;      
29d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
29d30 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73  et within poslis
29d40 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  t */.    i64 iRo
29d50 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
29d60 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
29d70 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
29d80 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49  char*)fts5MultiI
29d90 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
29da0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
29db0 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72  his is a new ter
29dc0 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e  m, query for it.
29dd0 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77   Update cksum3 w
29de0 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ith the results.
29df0 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74   */.    fts5Test
29e00 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a  Term(p, &term, z
29e10 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b  , n, cksum2, &ck
29e20 73 75 6d 33 29 3b 0a 0a 20 20 20 20 70 6f 73 6c  sum3);..    posl
29e30 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66  ist.n = 0;.    f
29e40 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
29e50 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
29e60 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
29e70 31 5d 2e 69 46 69 72 73 74 5d 20 2c 20 30 2c 20  1].iFirst] , 0, 
29e80 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 77  &poslist);.    w
29e90 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
29ea0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
29eb0 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
29ec0 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
29ed0 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 69  iPos) ){.      i
29ee0 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
29ef0 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b  OS2COLUMN(iPos);
29f00 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f  .      int iTokO
29f10 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
29f20 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20  FSET(iPos);.    
29f30 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69    cksum2 ^= sqli
29f40 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
29f50 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
29f60 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31  Col, iTokOff, -1
29f70 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , z, n);.    }. 
29f80 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72   }.  fts5TestTer
29f90 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30  m(p, &term, 0, 0
29fa0 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
29fb0 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69  3);..  fts5Multi
29fc0 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65  IterFree(p, pIte
29fd0 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r);.  if( p->rc=
29fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
29ff0 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  sum!=cksum2 ) p-
2a000 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2a010 50 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63  PT;..  fts5Struc
2a020 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
2a030 75 63 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  uct);.#ifdef SQL
2a040 49 54 45 5f 44 45 42 55 47 0a 20 20 66 74 73 35  ITE_DEBUG.  fts5
2a050 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
2a060 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 74 73 35  );.#endif.  fts5
2a070 42 75 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c  BufferFree(&posl
2a080 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ist);.  return f
2a090 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
2a0a0 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
2a0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2a100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
2a140 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
2a150 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
2a160 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73  ation of the fts
2a170 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61  5_decode() scala
2a180 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  r.** function on
2a190 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ly..*/../*.** De
2a1a0 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64  code a segment-d
2a1b0 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74  ata rowid from t
2a1c0 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
2a1d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2a1e0 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74  s.** the opposit
2a1f0 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f  e of macro FTS5_
2a200 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e  SEGMENT_ROWID().
2a210 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a220 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2a230 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20  .  i64 iRowid,  
2a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a250 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d     /* Rowid from
2a260 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
2a270 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c  .  int *piSegid,
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65     /* OUT: Segme
2a2a0 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  nt id */.  int *
2a2b0 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20  pbDlidx,        
2a2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2a2d0 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f  T: Dlidx flag */
2a2e0 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74  .  int *piHeight
2a2f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a300 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68     /* OUT: Heigh
2a310 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67  t */.  int *piPg
2a320 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
2a330 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
2a340 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
2a350 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e  .  *piPgno = (in
2a360 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
2a370 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
2a380 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b  A_PAGE_B) - 1));
2a390 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2a3a0 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a  S5_DATA_PAGE_B;.
2a3b0 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28  .  *piHeight = (
2a3c0 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
2a3d0 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
2a3e0 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20  ATA_HEIGHT_B) - 
2a3f0 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
2a400 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  = FTS5_DATA_HEIG
2a410 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64  HT_B;..  *pbDlid
2a420 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  x = (int)(iRowid
2a430 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52   & 0x0001);.  iR
2a440 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
2a450 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69  TA_DLI_B;..  *pi
2a460 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52  Segid = (int)(iR
2a470 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
2a480 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  << FTS5_DATA_ID_
2a490 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61  B) - 1));.}..sta
2a4a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
2a4b0 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63  ugRowid(int *pRc
2a4c0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
2a4d0 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20  uf, i64 iKey){. 
2a4e0 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65   int iSegid, iHe
2a4f0 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c  ight, iPgno, bDl
2a500 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  idx;       /* Ro
2a510 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a  wid compenents *
2a520 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f  /.  fts5DecodeRo
2a530 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69  wid(iKey, &iSegi
2a540 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65  d, &bDlidx, &iHe
2a550 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a  ight, &iPgno);..
2a560 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20    if( iSegid==0 
2a570 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d  ){.    if( iKey=
2a580 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52  =FTS5_AVERAGES_R
2a590 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71  OWID ){.      sq
2a5a0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2a5b0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2a5c0 20 70 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65   pBuf, "{average
2a5d0 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  s} ");.    }else
2a5e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
2a5f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2a600 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2a610 20 22 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b   "{structure}");
2a620 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73  .    }.  }.  els
2a630 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  e{.    sqlite3Ft
2a640 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2a650 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2a660 22 7b 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25  "{%ssegid=%d h=%
2a670 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20  d pgno=%d}",.   
2a680 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64       bDlidx ? "d
2a690 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65  lidx " : "", iSe
2a6a0 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50  gid, iHeight, iP
2a6b0 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  gno.    );.  }.}
2a6c0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
2a6d0 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
2a6e0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a700 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2a710 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2a720 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2a730 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2a740 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76   *p.){.  int iLv
2a750 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  l, iSeg;        
2a760 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2a770 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
2a780 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ls, segments */.
2a790 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69  .  for(iLvl=0; i
2a7a0 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69  Lvl<p->nLevel; i
2a7b0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  Lvl++){.    Fts5
2a7c0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
2a7d0 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65  pLvl = &p->aLeve
2a7e0 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c  l[iLvl];.    sql
2a7f0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2a800 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2a810 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22  pBuf, .        "
2a820 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d   {lvl=%d nMerge=
2a830 25 64 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76  %d nSeg=%d", iLv
2a840 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c  l, pLvl->nMerge,
2a850 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20   pLvl->nSeg.    
2a860 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d  );.    for(iSeg=
2a870 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
2a880 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
2a890 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
2a8a0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
2a8b0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
2a8c0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
2a8d0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2a8e0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2a8f0 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65 61 76 65  , " {id=%d leave
2a900 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20  s=%d..%d}", .   
2a910 20 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65         pSeg->iSe
2a920 67 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46  gid, pSeg->pgnoF
2a930 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  irst, pSeg->pgno
2a940 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  Last.      );.  
2a950 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
2a960 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2a970 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2a980 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   "}");.  }.}../*
2a990 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74  .** This is part
2a9a0 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2a9b0 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20  ode() debugging 
2a9c0 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  aid..**.** Argum
2a9d0 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62  ents pBlob/nBlob
2a9e0 20 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61   contain a seria
2a9f0 6c 69 7a 65 64 20 46 74 73 35 53 74 72 75 63 74  lized Fts5Struct
2aa00 75 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  ure object. This
2aa10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
2aa20 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
2aa30 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  dable representa
2aa40 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
2aa50 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68   object.** to th
2aa60 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
2aa70 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2aa80 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74  gument. .*/.stat
2aa90 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2aaa0 64 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  deStructure(.  i
2aab0 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aad0 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
2aae0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2aaf0 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f  ffer *pBuf,.  co
2ab00 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69  nst u8 *pBlob, i
2ab10 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e  nt nBlob.){.  in
2ab20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ab40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2ab50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
2ab60 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
2ab70 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72    /* Decoded str
2ab80 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f  ucture object */
2ab90 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72  ..  rc = fts5Str
2aba0 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c  uctureDecode(pBl
2abb0 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70  ob, nBlob, 0, &p
2abc0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2abd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
2abe0 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  Rc = rc;.    ret
2abf0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  urn;.  }..  fts5
2ac00 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 70  DebugStructure(p
2ac10 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20  Rc, pBuf, p);.  
2ac20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
2ac30 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ease(p);.}../*.*
2ac40 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f  * This is part o
2ac50 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2ac60 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69  e() debugging ai
2ac70 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
2ac80 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63  ts pBlob/nBlob c
2ac90 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76 65 72 61  ontain an "avera
2aca0 67 65 73 22 20 72 65 63 6f 72 64 2e 20 54 68 69  ges" record. Thi
2acb0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
2acc0 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72  ppends a human-r
2acd0 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e  eadable represen
2ace0 74 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64  tation of record
2acf0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
2ad00 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65  assed .** as the
2ad10 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2ad20 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2ad30 64 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72  d fts5DecodeAver
2ad40 61 67 65 73 28 0a 20 20 69 6e 74 20 2a 70 52 63  ages(.  int *pRc
2ad50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ad60 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2ad70 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
2ad80 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2ad90 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  Buf,.  const u8 
2ada0 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
2adb0 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  b.){.  int i = 0
2adc0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2add0 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20  zSpace = "";..  
2ade0 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29  while( i<nBlob )
2adf0 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a  {.    u64 iVal;.
2ae00 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
2ae10 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
2ae20 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b  Blob[i], &iVal);
2ae30 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2ae40 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ae50 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 25  tf(pRc, pBuf, "%
2ae60 73 25 64 22 2c 20 7a 53 70 61 63 65 2c 20 28 69  s%d", zSpace, (i
2ae70 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53  nt)iVal);.    zS
2ae80 70 61 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a  pace = " ";.  }.
2ae90 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  }../*.** Buffer 
2aea0 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64  (a/n) is assumed
2aeb0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69   to contain a li
2aec0 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64  st of serialized
2aed0 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a   varints. Read.*
2aee0 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e  * each varint an
2aef0 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74 72  d append its str
2af00 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
2af10 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  on to buffer pBu
2af20 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74  f. Return.** aft
2af30 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  er either the in
2af40 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65 78  put buffer is ex
2af50 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20 76  hausted or a 0 v
2af60 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a  alue is read..**
2af70 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2af80 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
2af90 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
2afa0 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
2afb0 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  buffer..*/.stati
2afc0 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65  c int fts5Decode
2afd0 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63  Poslist(int *pRc
2afe0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
2aff0 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  uf, const u8 *a,
2b000 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
2b010 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  Off = 0;.  while
2b020 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2b030 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f  int iVal;.    iO
2b040 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2b050 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2b060 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  iVal);.    sqlit
2b070 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2b080 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2b090 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29  uf, " %d", iVal)
2b0a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
2b0b0 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
2b0c0 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66 65  e start of buffe
2b0d0 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73  r (a/n) contains
2b0e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
2b0f0 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63  doclist. The doc
2b100 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d  list.** may or m
2b110 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69  ay not finish wi
2b120 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e  thin the buffer.
2b130 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2b140 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a  ppends a text.**
2b150 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2b160 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20 74  of the part of t
2b170 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20  he doclist that 
2b180 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75  is present to bu
2b190 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a  ffer.** pBuf. .*
2b1a0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
2b1b0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
2b1c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
2b1d0 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
2b1e0 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
2b1f0 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
2b200 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52  eDoclist(int *pR
2b210 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
2b220 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
2b230 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20  , int n){.  i64 
2b240 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e  iDocid = 0;.  in
2b250 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69  t iOff = 0;..  i
2b260 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f  f( n>0 ){.    iO
2b270 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ff = sqlite3Fts5
2b280 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36  GetVarint(a, (u6
2b290 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20  4*)&iDocid);.   
2b2a0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2b2b0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2b2c0 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25  Rc, pBuf, " id=%
2b2d0 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
2b2e0 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66   }.  while( iOff
2b2f0 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50  <n ){.    int nP
2b300 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 6c  os;.    int bDel
2b310 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
2b320 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
2b330 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  (&a[iOff], &nPos
2b340 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20 20 73 71  , &bDel);.    sq
2b350 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2b360 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2b370 20 70 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64   pBuf, " nPos=%d
2b380 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f  %s", nPos, bDel?
2b390 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66  "*":"");.    iOf
2b3a0 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50  f += fts5DecodeP
2b3b0 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66  oslist(pRc, pBuf
2b3c0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28  , &a[iOff], MIN(
2b3d0 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a  n-iOff, nPos));.
2b3e0 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
2b3f0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
2b400 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ta;.      iOff +
2b410 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2b420 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
2b430 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
2b440 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d  .      iDocid +=
2b450 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73   iDelta;.      s
2b460 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2b470 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2b480 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c  , pBuf, " id=%ll
2b490 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20  d", iDocid);.   
2b4a0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2b4b0 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
2b4c0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
2b4d0 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
2b4e0 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
2b4f0 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  on fts5_decode()
2b500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b510 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
2b520 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
2b530 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
2b540 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2b550 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
2b560 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b590 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
2b5a0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
2b5b0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
2b5c0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2b5d0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
2b5e0 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
2b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b600 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2b610 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  r record being d
2b620 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ecoded */.  int 
2b630 69 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69  iSegid,iHeight,i
2b640 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52  Pgno,bDlidx;/* R
2b650 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  owid components 
2b660 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
2b670 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20  Blob; int n;    
2b680 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
2b690 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38  o decode */.  u8
2b6a0 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42   *a = 0;.  Fts5B
2b6b0 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20  uffer s;        
2b6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
2b6d0 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72  ild up text to r
2b6e0 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20  eturn here */.  
2b6f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b700 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2b710 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2b720 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d  /.  int nSpace =
2b730 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   0;..  assert( n
2b740 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73  Arg==2 );.  mems
2b750 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
2b760 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
2b770 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
2b780 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
2b790 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d  Val[0]);..  /* M
2b7a0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2b7b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2b7c0 74 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42  t (a blob) in aB
2b7d0 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62  lob[]. The aBlob
2b7e0 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20  [].  ** copy is 
2b7f0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35  followed by FTS5
2b800 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
2b810 4e 47 20 30 78 30 30 20 62 79 74 65 73 2c 20 77  NG 0x00 bytes, w
2b820 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20  hich prevents.  
2b830 2a 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ** buffer overre
2b840 61 64 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  ads even if the 
2b850 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2b860 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c  t.  */.  n = sql
2b870 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2b880 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42  (apVal[1]);.  aB
2b890 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
2b8a0 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31  lue_blob(apVal[1
2b8b0 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e  ]);.  nSpace = n
2b8c0 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
2b8d0 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d  O_PADDING;.  a =
2b8e0 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73   (u8*)sqlite3Fts
2b8f0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
2b900 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
2b910 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f  a==0 ) goto deco
2b920 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79  de_out;.  memcpy
2b930 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a  (a, aBlob, n);..
2b940 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
2b950 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67  id(iRowid, &iSeg
2b960 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
2b970 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
2b980 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  .  fts5DebugRowi
2b990 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69  d(&rc, &s, iRowi
2b9a0 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78  d);.  if( bDlidx
2b9b0 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
2b9c0 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35   dlidx;.    Fts5
2b9d0 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20  DlidxLvl lvl;.. 
2b9e0 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a     dlidx.p = a;.
2b9f0 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e      dlidx.nn = n
2ba00 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c  ;..    memset(&l
2ba10 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
2ba20 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
2ba30 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64    lvl.pData = &d
2ba40 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c  lidx;.    lvl.iL
2ba50 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b  eafPgno = iPgno;
2ba60 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c  ..    for(fts5Dl
2ba70 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
2ba80 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66  ; lvl.bEof==0; f
2ba90 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
2baa0 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71  &lvl)){.      sq
2bab0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2bac0 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
2bad0 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &s, .          
2bae0 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c  " %d(%lld)", lvl
2baf0 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e  .iLeafPgno, lvl.
2bb00 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a  iRowid.      );.
2bb10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2bb20 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2bb30 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46     if( iRowid==F
2bb40 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2bb50 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ID ){.      fts5
2bb60 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 26  DecodeAverages(&
2bb70 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
2bb80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bb90 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
2bba0 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
2bbb0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
2bbc0 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  e{.    Fts5Buffe
2bbd0 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
2bbe0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2bbf0 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
2bc00 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
2bc10 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  zLeaf;          
2bc20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2bc30 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61  et of pgidx in a
2bc40 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50  [] */.    int iP
2bc50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74  gidxOff;.    int
2bc60 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b   iPgidxPrev = 0;
2bc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
2bc80 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61  evious value rea
2bc90 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a  d from pgidx */.
2bca0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
2bcb0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52   = 0;.    int iR
2bcc0 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
2bcd0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
2bce0 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20  nt nDoclist;..  
2bcf0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
2bd00 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
2bd10 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
2bd20 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71   n<4 ){.      sq
2bd30 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
2bd40 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28  et(&rc, &s, 7, (
2bd50 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75  const u8*)"corru
2bd60 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pt");.      goto
2bd70 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
2bd80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
2bd90 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
2bda0 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
2bdb0 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73     iPgidxOff = s
2bdc0 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
2bdd0 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20  16(&a[2]);.     
2bde0 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
2bdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
2be00 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2be10 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
2be20 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Off);.      }.  
2be30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
2be40 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  de the position 
2be50 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65  list tail at the
2be60 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
2be70 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52  ge */.    if( iR
2be80 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20  owidOff!=0 ){.  
2be90 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69      iOff = iRowi
2bea0 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20  dOff;.    }else 
2beb0 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20  if( iTermOff!=0 
2bec0 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
2bed0 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65  iTermOff;.    }e
2bee0 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
2bef0 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
2bf00 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
2bf10 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
2bf20 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
2bf30 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e      /* Decode an
2bf40 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64  y more doclist d
2bf50 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
2bf60 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65 66   on the page bef
2bf70 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66  ore the.    ** f
2bf80 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
2bf90 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54    nDoclist = (iT
2bfa0 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66  ermOff ? iTermOf
2bfb0 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f  f : szLeaf) - iO
2bfc0 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f  ff;.    fts5Deco
2bfd0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
2bfe0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f  s, &a[iOff], nDo
2bff0 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69  clist);..    whi
2c000 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  le( iPgidxOff<n 
2c010 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  ){.      int bFi
2c020 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66  rst = (iPgidxOff
2c030 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f  ==szLeaf);     /
2c040 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
2c050 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
2c060 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
2c070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c090 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
2c0a0 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b  .      int iEnd;
2c0b0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50  .      .      iP
2c0c0 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
2c0d0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2c0e0 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
2c0f0 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72  ;.      iPgidxPr
2c100 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ev += nByte;.   
2c110 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78     iOff = iPgidx
2c120 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28  Prev;..      if(
2c130 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
2c140 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2c150 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
2c160 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
2c170 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50         iEnd = iP
2c180 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65  gidxPrev + nByte
2c190 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c1a0 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a         iEnd = sz
2c1b0 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
2c1c0 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
2c1d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  =0 ){.        iO
2c1e0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2c1f0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2c200 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
2c210 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a  term.n = nByte;.
2c220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
2c230 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2c240 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2c250 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74  nByte);.      ft
2c260 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
2c270 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
2c280 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
2c290 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
2c2a0 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Byte;..      sql
2c2b0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2c2c0 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
2c2d0 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
2c2e0 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
2c2f0 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
2c300 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
2c310 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2c320 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2c330 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
2c340 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b  ff], iEnd-iOff);
2c350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
2c360 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
2c370 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64  );.  }.  . decod
2c380 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
2c390 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
2c3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2c3c0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
2c3d0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
2c3e0 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
2c3f0 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
2c400 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2c410 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
2c420 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
2c430 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2c440 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
2c450 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2c460 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
2c470 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
2c480 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
2c490 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2c4a0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
2c4b0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2c4c0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
2c4d0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
2c4e0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
2c4f0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c510 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2c520 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
2c530 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2c540 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
2c550 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
2c560 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2c570 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2c580 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
2c590 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2c5a0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2c5b0 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
2c5c0 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
2c5d0 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
2c5e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
2c5f0 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
2c600 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2c610 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
2c620 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
2c630 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
2c640 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
2c650 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
2c660 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c        int segid,
2c670 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
2c680 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
2c690 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2c6a0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
2c6c0 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2c6d0 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
2c6e0 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  gid, pgno))", -1
2c6f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2c700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c710 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
2c720 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2c730 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [1]);.        pg
2c740 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
2c750 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
2c760 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
2c770 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2c780 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e  ROWID(segid, pgn
2c790 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2c7a0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2c7b0 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
2c7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2c7d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2c7e0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
2c7f0 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
2c800 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
2c810 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
2c820 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a  'segment'" , -1.
2c830 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2c840 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2c850 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
2c860 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
2c870 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
2c880 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
2c890 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
2c8a0 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
2c8b0 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
2c8c0 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
2c8d0 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
2c8e0 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
2c8f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
2c900 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2c910 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
2c920 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
2c930 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
2c940 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2c950 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
2c960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2c970 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
2c980 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
2c990 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
2c9a0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
2c9b0 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
2c9c0 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
2c9d0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
2c9e0 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
2c9f0 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  0.  );.  if( rc=
2ca00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ca10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
2ca20 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
2ca30 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
2ca40 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51  5_rowid", -1, SQ
2ca50 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
2ca60 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c  s5RowidFunction,
2ca70 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
2ca80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ca90 0a                                               .