/ Hex Artifact Content
Login

Artifact 45856922243dc5f9d5bdc3b677d68e27997df600:


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 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
28e0: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
28f0: 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e     /* Max pendin
2900: 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c  g data before fl
2910: 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ush to disk */. 
2920: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74   int nPendingDat
2930: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2940: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2950: 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74  s of pending dat
2960: 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74  a */.  i64 iWrit
2970: 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  eRowid;         
2980: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2990: 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20  for current doc 
29a0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
29b0: 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 3b 20  .  int bDelete; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
29e0: 69 74 65 20 69 73 20 61 20 64 65 6c 65 74 65 20  ite is a delete 
29f0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2a00: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a30: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2a40: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2a50: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2a60: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2a70: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2a80: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2aa0: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2ab0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2ac0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2ad0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2ae0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2af0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2b00: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
2b10: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2b20: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
2b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
2b40: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
2b50: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c   id<=?" */.  sql
2b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 57  ite3_stmt *pIdxW
2b70: 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  riter;       /* 
2b80: 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64  "INSERT ... %_id
2b90: 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  x VALUES(?,?,?,?
2ba0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2bb0: 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65 74 65  stmt *pIdxDelete
2bc0: 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45  r;      /* "DELE
2bd0: 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20 57 48  TE FROM %_idx WH
2be0: 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20  ERE segid=? */. 
2bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c00: 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74  IdxSelect;.  int
2c10: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2c40: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
2c50: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
2c60: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38  clistIter {.  u8
2c70: 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20 20   *aEof;         
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
2ca0: 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64  te past end of d
2cb0: 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20  oclist */..  /* 
2cc0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
2cd0: 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74  . aPoslist==0 at
2ce0: 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52   EOF */.  i64 iR
2cf0: 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73  owid;.  u8 *aPos
2d00: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73  list;.  int nPos
2d10: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69 7a  list;.  int nSiz
2d20: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.};../*.** The
2d30: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d40: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
2d50: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
2d60: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
2d70: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
2d80: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
2d90: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
2da0: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
2db0: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
2dc0: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
2dd0: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
2de0: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
2df0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2e00: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
2e10: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e30: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
2e40: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
2e70: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
2e80: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
2e90: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
2ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
2eb0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
2ec0: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
2ed0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2ee0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
2ef0: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f20: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
2f30: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
2f40: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
2f70: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
2f80: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2f90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
2fa0: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
2fb0: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
2fc0: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
2fd0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2fe0: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e  Structure {.  in
2ff0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   Object referenc
3020: 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34  e count */.  u64
3030: 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20   nWriteCounter; 
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69  Total leaves wri
3060: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20  tten to level 0 
3070: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
3080: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3090: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65       /* Total se
30a0: 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73  gments in this s
30b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
30c0: 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20  t nLevel;       
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   Number of level
30f0: 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20  s in this index 
3100: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
3110: 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31  reLevel aLevel[1
3120: 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  ];   /* Array of
3130: 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62   nLevel level ob
3140: 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  jects */.};../*.
3150: 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20  ** An object of 
3160: 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69 74  type Fts5SegWrit
3170: 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  er is used to wr
3180: 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e  ite to segments.
3190: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
31a0: 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  ageWriter {.  in
31b0: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
31e0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
31f0: 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b 20  int iPrevPgidx; 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
3220: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  e written into p
3230: 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42 75  gidx */.  Fts5Bu
3240: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3260: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c  fer containing l
3270: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
3280: 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b 20  s5Buffer pgidx; 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
32b0: 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a 2f  ng page-index */
32c0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
32d0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
32e0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
32f0: 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73  taining previous
3300: 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
3310: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44  .};.struct Fts5D
3320: 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69  lidxWriter {.  i
3330: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3350: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3360: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3370: 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b   int bPrevValid;
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65   /* True if iPre
33a0: 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  v is valid */.  
33b0: 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20  i64 iPrev;      
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
33e0: 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  d value written 
33f0: 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73  to page */.  Fts
3400: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3430: 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  g page data */.}
3440: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  ;.struct Fts5Seg
3450: 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69  Writer {.  int i
3460: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
3480: 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gid to write to 
3490: 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
34a0: 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20  ter writer;     
34b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69 74       /* PageWrit
34c0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
34d0: 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20  64 iPrevRowid;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34f0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  * Previous rowid
3500: 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72   written to curr
3510: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38  ent leaf */.  u8
3520: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f   bFirstRowidInDo
3530: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  clist;        /*
3540: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3550: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3560: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  doclist */.  u8 
3570: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
3580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3590: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
35a0: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70  id is first in p
35b0: 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44 4f  age */.  /* TODO
35c0: 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69 74  1: Can use (writ
35d0: 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20 69  er.pgidx.n==0) i
35e0: 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73 74  nstead of bFirst
35f0: 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20 20  TermInPage */.  
3600: 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50  u8 bFirstTermInP
3610: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
3620: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3630: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72  term will be fir
3640: 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  st in leaf */.  
3650: 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e  int nLeafWritten
3660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
3680: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
3690: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b  */.  int nEmpty;
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 4e 75 6d 62 65 72 20 6f       /* Number o
36c0: 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72  f contiguous ter
36d0: 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a  m-less nodes */.
36e0: 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20 20  .  int nDlidx;  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3710: 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b 5d  size of aDlidx[]
3720: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
3740: 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  idx;        /* A
3750: 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69 64  rray of Fts5Dlid
3760: 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  xWriter objects 
3770: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73 20  */..  /* Values 
3780: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  to insert into t
3790: 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a  he %_idx table *
37a0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
37b0: 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  tterm;          
37c0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72 6d      /* Next term
37d0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
37e0: 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a 20  %_idx table */. 
37f0: 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20 20   int iBtPage;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3820: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
3830: 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a 74   btterm */.};..t
3840: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
3850: 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43 52  s5CResult Fts5CR
3860: 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46 74  esult;.struct Ft
3870: 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75 31  s5CResult {.  u1
3880: 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20  6 iFirst;       
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38a0: 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66   aSeg[] index of
38b0: 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61 74   firstest iterat
38c0: 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d  or */.  u8 bTerm
38d0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
38f0: 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72 65  if the terms are
3900: 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   equal */.};../*
3910: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
3920: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
3930: 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
3940: 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  t, visiting each
3950: 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20 70   term/rowid.** p
3960: 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65  air in the segme
3970: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a  nt..**.** pSeg:.
3980: 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74  **   The segment
3990: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
39a0: 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ugh..**.** iLeaf
39b0: 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65  Pgno:.**   Curre
39c0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
39d0: 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65  ber within segme
39e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f  nt..**.** iLeafO
39f0: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65  ffset:.**   Byte
3a00: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
3a10: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
3a20: 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72 73  that is the firs
3a30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
3a40: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
3a50: 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74 65  t data (one byte
3a60: 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73 69   passed the posi
3a70: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
3a80: 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69  ield)..**   rowi
3a90: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
3aa0: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
3ab0: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
3ac0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
3ad0: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
3ae0: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
3af0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
3b00: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
3b10: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3b20: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
3b30: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
3b40: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
3b50: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
3b60: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
3b70: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
3b80: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
3b90: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
3ba0: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
3bb0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
3bc0: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
3bd0: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
3be0: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
3bf0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
3c00: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
3c10: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
3c20: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
3c30: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
3c40: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
3c50: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
3c60: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
3c70: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
3c80: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
3c90: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
3ca0: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
3cb0: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
3cc0: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
3cd0: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
3ce0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
3cf0: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
3d00: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
3d10: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
3d20: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
3d30: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
3d40: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
3d50: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
3d60: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
3d70: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
3d80: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
3d90: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
3da0: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
3db0: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
3dc0: 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20 69   through rowid i
3dd0: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  n descending ord
3de0: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  er instead of th
3df0: 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74  e.**     default
3e00: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
3e10: 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66  ..**.** iRowidOf
3e20: 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65  fset/nRowidOffse
3e30: 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a  t/aRowidOffset:.
3e40: 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72 65  **     These are
3e50: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
3e60: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
3e70: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  E flag is set..*
3e80: 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61 63  *.**     For eac
3e90: 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  h rowid on the p
3ea0: 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  age correspondin
3eb0: 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
3ec0: 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20 20   term, the.**   
3ed0: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
3ee0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 65  aRowidOffset[] e
3ef0: 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 74  ntry is set to t
3f00: 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 6f  he byte offset o
3f10: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74 61  f the.**     sta
3f20: 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69 74  rt of the "posit
3f30: 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20 66  ion-list-size" f
3f40: 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20  ield within the 
3f50: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72  page..**.** iTer
3f60: 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e 64  mIdx:.**     Ind
3f70: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  ex of current te
3f80: 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66 50  rm on iTermLeafP
3f90: 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  gno..*/.struct F
3fa0: 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20 46  ts5SegIter {.  F
3fb0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
3fc0: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
3fd0: 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74 65  * Segment to ite
3fe0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
3ff0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e    /* Mask of con
4020: 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73  figuration flags
4030: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
4040: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4050: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4060: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
4070: 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  r */.  Fts5Data 
4080: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
4090: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40a0: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
40b0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78 74   Fts5Data *pNext
40c0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
40d0: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28 69   /* Leaf page (i
40e0: 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20  LeafPgno+1) */. 
40f0: 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74   int iLeafOffset
4100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4110: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
4120: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
4130: 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  eaf */..  /* The
4140: 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74   page and offset
4150: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20   from which the 
4160: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73  current term was
4170: 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65   read. The offse
4180: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f  t .  ** is the o
4190: 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69 72  ffset of the fir
41a0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
41b0: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e  current doclist.
41c0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d    */.  int iTerm
41d0: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
41e0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
41f0: 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66  ..  int iPgidxOf
4200: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
4210: 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
4220: 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20  et in pgidx */. 
4230: 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63 6c 69   int iEndofDocli
4240: 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  st;..  /* The fo
4250: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
4260: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
4270: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4280: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a  E flag is set. *
4290: 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  /.  int iRowidOf
42a0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
42b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65      /* Current e
42c0: 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66  ntry in aRowidOf
42d0: 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  fset[] */.  int 
42e0: 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  nRowidOffset;   
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4300: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
4310: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4320: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
4330: 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  aRowidOffset;   
4340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4350: 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f  ray of offset to
4360: 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f   rowid fields */
4370: 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ..  Fts5DlidxIte
4380: 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20  r *pDlidx;      
4390: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
43a0: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
43b0: 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69  ex */..  /* Vari
43c0: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
43d0: 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74  based on current
43e0: 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73   entry. */.  Fts
43f0: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4410: 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  Current term */.
4420: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
4450: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73  id */.  int nPos
4460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4470: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4480: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75  r of bytes in cu
4490: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
44a0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ist */.  int bDe
44b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
44c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
44d0: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
44e0: 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b  lag is set */.};
44f0: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
4500: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4510: 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72   an Fts5Data str
4520: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
4530: 61 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20  ains a .** leaf 
4540: 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  page..*/.#define
4550: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
4560: 4b 28 78 29 20 61 73 73 65 72 74 28 20 5c 0a 20  K(x) assert( \. 
4570: 20 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d     (x)->szLeaf==
4580: 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28 78 29 2d 3e  (x)->nn || (x)->
4590: 73 7a 4c 65 61 66 3d 3d 66 74 73 35 47 65 74 55  szLeaf==fts5GetU
45a0: 31 36 28 26 28 78 29 2d 3e 70 5b 32 5d 29 20 5c  16(&(x)->p[2]) \
45b0: 0a 29 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .)..#define FTS5
45c0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
45d0: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54   0x01.#define FT
45e0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
45f0: 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a  SE 0x02.../* .**
4600: 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   Argument is a p
4610: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73  ointer to an Fts
4620: 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  5Data structure 
4630: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
4640: 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68  leaf.** page. Th
4650: 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74  is macro evaluat
4660: 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  es to true if th
4670: 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20  e leaf contains 
4680: 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20  no terms, or.** 
4690: 66 61 6c 73 65 20 69 66 20 69 74 20 63 6f 6e 74  false if it cont
46a0: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
46b0: 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69  e term..*/.#defi
46c0: 6e 65 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  ne fts5LeafIsTer
46d0: 6d 6c 65 73 73 28 78 29 20 28 28 78 29 2d 3e 73  mless(x) ((x)->s
46e0: 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e  zLeaf >= (x)->nn
46f0: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4700: 65 61 66 54 65 72 6d 4f 66 66 28 78 2c 20 69 29  eafTermOff(x, i)
4710: 20 28 66 74 73 35 47 65 74 55 31 36 28 26 28 78   (fts5GetU16(&(x
4720: 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65 61 66  )->p[(x)->szLeaf
4730: 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a 23 64 65   + (i)*2]))..#de
4740: 66 69 6e 65 20 66 74 73 35 4c 65 61 66 46 69 72  fine fts5LeafFir
4750: 73 74 52 6f 77 69 64 4f 66 66 28 78 29 20 28 66  stRowidOff(x) (f
4760: 74 73 35 47 65 74 55 31 36 28 28 78 29 2d 3e 70  ts5GetU16((x)->p
4770: 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  ))../*.** Object
4780: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
4790: 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65  hrough the merge
47a0: 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65  d results of one
47b0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
47c0: 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65  s,.** visiting e
47d0: 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 20 70  ach term/rowid p
47e0: 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65  air in the merge
47f0: 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53  d data..**.** nS
4800: 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70  eg is always a p
4810: 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61  ower of two grea
4820: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4830: 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  l to the number 
4840: 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74  of.** segments t
4850: 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hat this object 
4860: 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20  is merging data 
4870: 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61  from. Both the a
4880: 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69  Seg[] and.** aFi
4890: 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65  rst[] arrays are
48a0: 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65   sized at nSeg e
48b0: 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67  ntries. The aSeg
48c0: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64  [] array is padd
48d0: 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65  ed.** with zeroe
48e0: 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73  d objects - thes
48f0: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73  e are handled as
4900: 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74   if they were it
4910: 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  erators opened.*
4920: 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65  * on empty segme
4930: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  nts..**.** The r
4940: 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
4950: 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65  ing segments aSe
4960: 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b  g[N] and aSeg[N+
4970: 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61  1], where N is a
4980: 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72  n.** even number
4990: 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  , is stored in a
49a0: 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32  First[(nSeg+N)/2
49b0: 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20  ]. The "result" 
49c0: 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61  of the .** compa
49d0: 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f  rison in this co
49e0: 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64  ntext is the ind
49f0: 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  ex of the iterat
4a00: 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  or that currentl
4a10: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  y.** points to t
4a20: 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f  he smaller term/
4a30: 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  rowid combinatio
4a40: 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20  n. Iterators at 
4a50: 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69  EOF are.** consi
4a60: 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61  dered to be grea
4a70: 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68  ter than all oth
4a80: 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a  er iterators..**
4a90: 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f  .** aFirst[1] co
4aa0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
4ab0: 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68   in aSeg[] of th
4ac0: 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  e iterator that 
4ad0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
4ae0: 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76   smallest key ov
4af0: 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d  erall. aFirst[0]
4b00: 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2a 0a   is unused. .**.
4b10: 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a 2a 20 20  ** poslist:.**  
4b20: 20 55 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   Used by sqlite3
4b30: 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28  Fts5IterPoslist(
4b40: 29 20 77 68 65 6e 20 74 68 65 20 70 6f 73 6c 69  ) when the posli
4b50: 73 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  st needs to be b
4b60: 75 66 66 65 72 65 64 2e 0a 2a 2a 20 20 20 54 68  uffered..**   Th
4b70: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
4b80: 20 74 65 6c 6c 20 69 66 20 74 68 69 73 20 69 73   tell if this is
4b90: 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 20 6e 6f   populated or no
4ba0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  t..*/.struct Fts
4bb0: 35 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46  5IndexIter {.  F
4bc0: 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
4bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4be0: 2a 20 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e  * Index that own
4bf0: 73 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  s this iterator 
4c00: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
4c10: 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
4c20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4c30: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
4c40: 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  his iterator */.
4c50: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
4c60: 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
4c70: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
4c80: 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70  aining current p
4c90: 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20 69 6e 74  oslist */..  int
4ca0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cc0: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4cd0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4ce0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d00: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4d10: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4d20: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4d50: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4d60: 65 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f 66 3b  es */.  u8 bEof;
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4d90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 75 38 20 62  at EOF */.  u8 b
4da0: 46 69 6c 74 65 72 65 64 3b 20 20 20 20 20 20 20  Filtered;       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4dc0: 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 2d 66 69  rue if column-fi
4dd0: 6c 74 65 72 20 61 6c 72 65 61 64 79 20 61 70 70  lter already app
4de0: 6c 69 65 64 20 2a 2f 0a 0a 20 20 69 36 34 20 69  lied */..  i64 i
4df0: 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20  SwitchRowid;    
4e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4e10: 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20  rstest rowid of 
4e20: 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72 73  other than aFirs
4e30: 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52  t[1] */.  Fts5CR
4e40: 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20  esult *aFirst;  
4e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4e60: 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65  rent merge state
4e70: 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
4e80: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61 53    Fts5SegIter aS
4e90: 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  eg[1];          
4ea0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
4eb0: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  gment iterators 
4ec0: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  */.};.../*.** An
4ed0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4ee0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
4ef0: 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
4f00: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  te through the c
4f10: 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20  ontents.** of a 
4f20: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65  doclist-index re
4f30: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74  cord..**.** pDat
4f40: 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63  a:.**   Record c
4f50: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f  ontaining the do
4f60: 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61  clist-index data
4f70: 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a  ..**.** bEof:.**
4f80: 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f     Set to true o
4f90: 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61 73  nce iterator has
4fa0: 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a   reached EOF..**
4fb0: 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53  .** iOff:.**   S
4fc0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  et to the curren
4fd0: 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  t offset within 
4fe0: 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f  record pData..*/
4ff0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
5000: 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74  xLvl {.  Fts5Dat
5010: 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  a *pData;       
5020: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
5030: 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  or current page 
5040: 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f  of this level */
5050: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20  .  int iOff;    
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73   /* Current offs
5080: 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f  et into pData */
5090: 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20  .  int bEof;    
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61   /* At EOF alrea
50c0: 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  dy */.  int iFir
50d0: 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  stOff;          
50e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
50f0: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
5100: 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70  rs */..  /* Outp
5110: 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  ut variables */.
5120: 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b    int iLeafPgno;
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
5150: 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  f current leaf p
5160: 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  age */.  i64 iRo
5170: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
5180: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5190: 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c  rowid on leaf iL
51a0: 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74  eafPgno */.};.st
51b0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74  ruct Fts5DlidxIt
51c0: 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b  er {.  int nLvl;
51d0: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
51e0: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c   Fts5DlidxLvl aL
51f0: 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69  vl[1];.};..stati
5200: 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55 31  c void fts5PutU1
5210: 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20  6(u8 *aOut, u16 
5220: 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d  iVal){.  aOut[0]
5230: 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20   = (iVal>>8);.  
5240: 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26  aOut[1] = (iVal&
5250: 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  0xFF);.}..static
5260: 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36 28   u16 fts5GetU16(
5270: 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a  const u8 *aIn){.
5280: 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29 61    return ((u16)a
5290: 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49  In[0] << 8) + aI
52a0: 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20  n[1];.} ../*.** 
52b0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
52c0: 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74 20  urn a buffer at 
52d0: 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65  least nByte byte
52e0: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
52f0: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
5300: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
5310: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
5320: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
5330: 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74  ode in.** the Ft
5340: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70  s5Index handle p
5350: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5360: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
5370: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
5380: 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49  5IdxMalloc(Fts5I
5390: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79  ndex *p, int nBy
53a0: 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  te){.  return sq
53b0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
53c0: 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74  ero(&p->rc, nByt
53d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  e);.}../*.** Com
53e0: 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
53f0: 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62  s of the pLeft b
5400: 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20 70  uffer with the p
5410: 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f  Right/nRight blo
5420: 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  b..**.** Return 
5430: 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20  -ve if pLeft is 
5440: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69  smaller than pRi
5450: 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61  ght, 0 if they a
5460: 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b  re equal or.** +
5470: 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20  ve if pRight is 
5480: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65  smaller than pLe
5490: 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ft. In other wor
54a0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65  ds:.**.**     re
54b0: 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52  s = *pLeft - *pR
54c0: 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ight.*/.#ifdef S
54d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
54e0: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
54f0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
5500: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
5510: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5520: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
5530: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
5540: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
5550: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
5560: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
5570: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
5580: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
5590: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
55a0: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
55b0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
55c0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
55d0: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
55e0: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
55f0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
5600: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e  t) : res);.}.#en
5610: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  dif../*.** Compa
5620: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5630: 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66 65  of the two buffe
5640: 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  rs using memcmp(
5650: 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72  ). If one buffer
5660: 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20  .** is a prefix 
5670: 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74  of the other, it
5680: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
5690: 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a  he lesser..**.**
56a0: 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70   Return -ve if p
56b0: 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  Left is smaller 
56c0: 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69  than pRight, 0 i
56d0: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
56e0: 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52   or.** +ve if pR
56f0: 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  ight is smaller 
5700: 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f  than pLeft. In o
5710: 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  ther words:.**.*
5720: 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65  *     res = *pLe
5730: 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a  ft - *pRight.*/.
5740: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
5750: 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73  ufferCompare(Fts
5760: 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20  5Buffer *pLeft, 
5770: 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69 67  Fts5Buffer *pRig
5780: 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  ht){.  int nCmp 
5790: 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20  = MIN(pLeft->n, 
57a0: 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e  pRight->n);.  in
57b0: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
57c0: 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d  Left->p, pRight-
57d0: 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  >p, nCmp);.  ret
57e0: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70  urn (res==0 ? (p
57f0: 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74  Left->n - pRight
5800: 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ->n) : res);.}..
5810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5820: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66  BUG.static int f
5830: 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 0a  ts5BlobCompare(.
5840: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66    const u8 *pLef
5850: 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20 0a 20  t, int nLeft, . 
5860: 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68   const u8 *pRigh
5870: 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29 7b  t, int nRight.){
5880: 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49  .  int nCmp = MI
5890: 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29  N(nLeft, nRight)
58a0: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
58b0: 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69 67  mcmp(pLeft, pRig
58c0: 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  ht, nCmp);.  ret
58d0: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 6e  urn (res==0 ? (n
58e0: 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20 3a  Left - nRight) :
58f0: 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a   res);.}.#endif.
5900: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
5910: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
5920: 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66  (Fts5Data *pLeaf
5930: 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
5940: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
5950: 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d  &pLeaf->p[pLeaf-
5960: 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a  >szLeaf], ret);.
5970: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5980: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
5990: 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20   read-only blob 
59a0: 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73  handle, if it is
59b0: 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   open..*/.static
59c0: 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52   void fts5CloseR
59d0: 65 61 64 65 72 28 46 74 73 35 49 6e 64 65 78 20  eader(Fts5Index 
59e0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52  *p){.  if( p->pR
59f0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  eader ){.    sql
5a00: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64  ite3_blob *pRead
5a10: 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b  er = p->pReader;
5a20: 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20  .    p->pReader 
5a30: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
5a40: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61  _blob_close(pRea
5a50: 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  der);.  }.}.../*
5a60: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
5a70: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
5a80: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
5a90: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
5aa0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
5ab0: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
5ac0: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
5ad0: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
5ae0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
5af0: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
5b00: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
5b10: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
5b20: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
5b30: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
5b40: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
5b50: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
5b60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20  SQLITE_OK;..    
5b70: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
5b80: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
5b90: 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72 6e 20  call may return 
5ba0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69 66 20  SQLITE_ABORT if 
5bb0: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 61  there has been a
5bc0: 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
5bd0: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e   ** rollback sin
5be0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 75  ce it was last u
5bf0: 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sed. In this cas
5c00: 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e  e a new blob han
5c10: 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  dle.      ** is 
5c20: 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
5c30: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5c40: 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65   *pBlob = p->pRe
5c50: 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  ader;.      p->p
5c60: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5c70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5c80: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62  lob_reopen(pBlob
5c90: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
5ca0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
5cb0: 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  der==0 );.      
5cc0: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70 42 6c  p->pReader = pBl
5cd0: 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ob;.      if( rc
5ce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5cf0: 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65         fts5Close
5d00: 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 20  Reader(p);.     
5d10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
5d20: 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 20  =SQLITE_ABORT ) 
5d30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5d40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5d50: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
5d60: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20   is not open at 
5d70: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e  this point, open
5d80: 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a 20 20   it and seek .  
5d90: 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65 71 75    ** to the requ
5da0: 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f  ested entry.  */
5db0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
5dc0: 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  der==0 && rc==SQ
5dd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5de0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
5df0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
5e00: 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  g;.      rc = sq
5e10: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
5e20: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20  pConfig->db, .  
5e30: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
5e40: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
5e50: 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77  l, "block", iRow
5e60: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64  id, 0, &p->pRead
5e70: 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  er.      );.    
5e80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  }..    /* If eit
5e90: 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 74  her of the sqlit
5ea0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f  e3_blob_open() o
5eb0: 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  r sqlite3_blob_r
5ec0: 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20  eopen() calls.  
5ed0: 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72    ** above retur
5ee0: 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ned SQLITE_ERROR
5ef0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5f00: 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e 73  CORRUPT_VTAB ins
5f10: 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c  tead..    ** All
5f20: 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68 6f   the reasons tho
5f30: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67  se functions mig
5f40: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
5f50: 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67  _ERROR - missing
5f60: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d  .    ** table, m
5f70: 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d  issing row, non-
5f80: 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f  blob/text in blo
5f90: 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69  ck column - indi
5fa0: 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61 63  cate .    ** bac
5fb0: 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72 75  king store corru
5fc0: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  ption.  */.    i
5fd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
5fe0: 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ROR ) rc = FTS5_
5ff0: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69 66  CORRUPT;..    if
6000: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6010: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 75  ){.      u8 *aOu
6020: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
6030: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f       /* Read blo
6040: 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  b data into this
6050: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20   buffer */.     
6060: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
6070: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
6080: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
6090: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
60a0: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
60b0: 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f   + nByte + FTS5_
60c0: 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20  DATA_PADDING;.  
60d0: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
60e0: 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Data*)sqlite3_ma
60f0: 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  lloc(nAlloc);.  
6100: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
6110: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e          pRet->nn
6120: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
6130: 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70    aOut = pRet->p
6140: 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d   = (u8*)&pRet[1]
6150: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6160: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6170: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6180: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
6190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
61a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
61b0: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e  e3_blob_read(p->
61c0: 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e  pReader, aOut, n
61d0: 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Byte, 0);.      
61e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
61f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6200: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6210: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
6220: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
6230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6240: 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20 74 68  /* TODO1: Fix th
6250: 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52  is */.        pR
6260: 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73  et->szLeaf = fts
6270: 35 47 65 74 55 31 36 28 26 70 52 65 74 2d 3e 70  5GetU16(&pRet->p
6280: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [2]);.      }.  
6290: 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20    }.    p->rc = 
62a0: 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64  rc;.    p->nRead
62b0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ++;.  }..  asser
62c0: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
62d0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
62e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
62f0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  t;.}../*.** Rele
6300: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
6310: 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72  to data record r
6320: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6330: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
6340: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e   fts5DataRead().
6350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6360: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
6370: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
6380: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
6390: 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74  (pData);.}..stat
63a0: 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
63b0: 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46  PrepareStmt(.  F
63c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73  ts5Index *p,.  s
63d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
63e0: 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt,.  char *zS
63f0: 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ql.){.  if( p->r
6400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6410: 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a      if( zSql ){.
6420: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
6430: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
6440: 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  (p->pConfig->db,
6450: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
6460: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
6470: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6480: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6490: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
64a0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
64b0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
64c0: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
64d0: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
64e0: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
64f0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
6500: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6510: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
6520: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
6530: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
6540: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
6550: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6560: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6570: 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72    if( p->pWriter
6580: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6590: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
65a0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
65b0: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
65c0: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72  eStmt(p, &p->pWr
65d0: 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
65e0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
65f0: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
6600: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64  %q'.'%q_data'(id
6610: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
6620: 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
6630: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6640: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6650: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
6660: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
6670: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6680: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69  nd_int64(p->pWri
6690: 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ter, 1, iRowid);
66a0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
66b0: 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c  blob(p->pWriter,
66c0: 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61   2, pData, nData
66d0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
66e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
66f0: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
6700: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
6710: 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72  reset(p->pWriter
6720: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
6730: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ute the followin
6740: 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  g SQL:.**.**    
6750: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64   DELETE FROM %_d
6760: 61 74 61 20 57 48 45 52 45 20 69 64 20 42 45 54  ata WHERE id BET
6770: 57 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44  WEEN $iFirst AND
6780: 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69   $iLast.*/.stati
6790: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 44  c void fts5DataD
67a0: 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78 20  elete(Fts5Index 
67b0: 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  *p, i64 iFirst, 
67c0: 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66  i64 iLast){.  if
67d0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
67e0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
67f0: 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d  if( p->pDeleter=
6800: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
6810: 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  ;.    Fts5Config
6820: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6830: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
6840: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
6850: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6860: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6870: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48  %q'.'%q_data' WH
6880: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
6890: 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20  <=?", .         
68a0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
68b0: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
68c0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
68d0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
68e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
68f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6900: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
6910: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
6920: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
6930: 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30   &p->pDeleter, 0
6940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6950: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
6960: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
6970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6980: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
6990: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
69a0: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
69b0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
69c0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
69d0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
69e0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
69f0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6a00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6a10: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
6a20: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6a30: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
6a40: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
6a50: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6a60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6a70: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6a90: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6aa0: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6ab0: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6ac0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6ad0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6ae0: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6af0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6b00: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6b10: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6b20: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6b30: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6b40: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6b50: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6b60: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6b70: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6b80: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6b90: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6ba0: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6bb0: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6bc0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6bd0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6be0: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6bf0: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6c00: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6c10: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6c20: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6c30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6c40: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c50: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6c60: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6c70: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6c80: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6c90: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6ca0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6cb0: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6cc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6cd0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6ce0: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6cf0: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6d00: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6d10: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6d20: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6d30: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6d40: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6d60: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6d70: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6d80: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6d90: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6da0: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6db0: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6dd0: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6de0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6df0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6e10: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6e20: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6e30: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6e40: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6e50: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6e60: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6e70: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6e80: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6e90: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6ea0: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6eb0: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6ec0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6ed0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6ee0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6ef0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6f00: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6f10: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
6f20: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
6f30: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
6f40: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
6f50: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
6f60: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
6f70: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
6f80: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
6f90: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
6fa0: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
6fb0: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
6fc0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
6fd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6fe0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
6ff0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
7000: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7010: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7020: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7030: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7040: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7050: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7060: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7070: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7080: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7090: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
70a0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
70b0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
70c0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
70d0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
70e0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
7110: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7120: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7130: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7140: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7150: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7160: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7170: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7190: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
71a0: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
71b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
71c0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
71d0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
71e0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
71f0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
7200: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  ;.  int nByte;  
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7230: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7240: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7250: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7260: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7270: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7280: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7290: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
72a0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
72b0: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
72c0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
72d0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
72e0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
72f0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
7300: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
7310: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7320: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7330: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7340: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
7350: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
7360: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7370: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7380: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7390: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
73a0: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
73b0: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
73c0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
73d0: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
73e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
73f0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7400: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7410: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
7420: 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20  nLevel-1)    /* 
7430: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
7440: 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20  /.  );.  pRet = 
7450: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
7460: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
7470: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
7480: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
7490: 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66  {.    pRet->nRef
74a0: 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e   = 1;.    pRet->
74b0: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
74c0: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d  .    pRet->nSegm
74d0: 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a  ent = nSegment;.
74e0: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
74f0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
7500: 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e  Data[i], &pRet->
7510: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
7520: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
7530: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7540: 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69  & iLvl<nLevel; i
7550: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
7560: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7570: 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e   *pLvl = &pRet->
7580: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7590: 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a      int nTotal;.
75a0: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
75b0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
75c0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
75d0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
75e0: 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  rge);.      i +=
75f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7600: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74  (&pData[i], nTot
7610: 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
7620: 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d  t( nTotal>=pLvl-
7630: 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  >nMerge );.     
7640: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
7650: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7660: 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ent*)sqlite3Fts5
7670: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
7680: 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61  .          nTota
7690: 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  l * sizeof(Fts5S
76a0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
76b0: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
76c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
76d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  OK ){.        pL
76e0: 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61  vl->nSeg = nTota
76f0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
7700: 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74  Seg=0; iSeg<nTot
7710: 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  al; iSeg++){.   
7720: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7730: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7740: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7750: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
7760: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7770: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7780: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7790: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
77a0: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
77b0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
77c0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
77d0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
77e0: 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  g].pgnoLast);.  
77f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
7810: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
7820: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
7830: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
7840: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7850: 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20  *ppOut = pRet;. 
7860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7870: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
7880: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
7890: 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70  eAddLevel(int *p
78a0: 52 63 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  Rc, Fts5Structur
78b0: 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20  e **ppStruct){. 
78c0: 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
78d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
78e0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
78f0: 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
7900: 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d      int nLevel =
7910: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7920: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
7930: 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65  = (.        size
7940: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7950: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
7960: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7970: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7980: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7990: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
79a0: 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c  nLevel+1)  /* aL
79b0: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
79c0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72      );..    pStr
79d0: 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  uct = sqlite3_re
79e0: 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e  alloc(pStruct, n
79f0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
7a00: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
7a10: 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d  memset(&pStruct-
7a20: 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c  >aLevel[nLevel],
7a30: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
7a40: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b  tructureLevel));
7a50: 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
7a60: 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20  nLevel++;.      
7a70: 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
7a80: 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  uct;.    }else{.
7a90: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
7aa0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
7ab0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7ac0: 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20  tend level iLvl 
7ad0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
7ae0: 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61   room for at lea
7af0: 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a  st nExtra more.*
7b00: 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  * segments..*/.s
7b10: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7b20: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
7b30: 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  vel(.  int *pRc,
7b40: 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72   .  Fts5Structur
7b50: 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69  e *pStruct, .  i
7b60: 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20  nt iLvl, .  int 
7b70: 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62  nExtra, .  int b
7b80: 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20  Insert.){.  if( 
7b90: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7ba0: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7bb0: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
7bc0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
7bd0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74  el[iLvl];.    Ft
7be0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7bf0: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e  nt *aNew;.    in
7c00: 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42  t nByte;..    nB
7c10: 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65  yte = (pLvl->nSe
7c20: 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69  g + nExtra) * si
7c30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7c40: 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
7c50: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
7c60: 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65  ealloc(pLvl->aSe
7c70: 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  g, nByte);.    i
7c80: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( aNew ){.     
7c90: 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20   if( bInsert==0 
7ca0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
7cb0: 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53  t(&aNew[pLvl->nS
7cc0: 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  eg], 0, sizeof(F
7cd0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7ce0: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
7cf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7d00: 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d       int nMove =
7d10: 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69   pLvl->nSeg * si
7d20: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7d30: 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
7d40: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65      memmove(&aNe
7d50: 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c  w[nExtra], aNew,
7d60: 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20   nMove);.       
7d70: 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c   memset(aNew, 0,
7d80: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7d90: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20  ctureSegment) * 
7da0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
7db0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  .      pLvl->aSe
7dc0: 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65  g = aNew;.    }e
7dd0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
7de0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7df0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7e00: 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69 61  ** Read, deseria
7e10: 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20  lize and return 
7e20: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
7e30: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cord..**.** The 
7e40: 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c  Fts5Structure.aL
7e50: 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20  evel[] and each 
7e60: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7e70: 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a  el.aSeg[] array.
7e80: 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f  ** are over-allo
7e90: 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69 62  cated as describ
7ea0: 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ed for function 
7eb0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
7ec0: 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e  ode() .** above.
7ed0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7ee0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
7ef0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
7f00: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65  an error code le
7f10: 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73  ft in the.** Fts
7f20: 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49  5Index handle. I
7f30: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
7f40: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
7f50: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7f60: 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  on.** is called,
7f70: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
7f80: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53 74  */.static Fts5St
7f90: 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74 72  ructure *fts5Str
7fa0: 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35 49  uctureRead(Fts5I
7fb0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
7fc0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
7fd0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
7fe0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7ff0: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
8000: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65 74  /* Object to ret
8010: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  urn */.  int iCo
8020: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
8030: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
8040: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
8050: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
8060: 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20  pData;..  pData 
8070: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
8080: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
8090: 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70  _ROWID);.  if( p
80a0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ->rc ) return 0;
80b0: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f 20 77  .  /* TODO: Do w
80c0: 65 20 6e 65 65 64 20 74 68 69 73 20 69 66 20 74  e need this if t
80d0: 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20 69 73  he leaf-index is
80e0: 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f 62 61   appended? Proba
80f0: 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d 65 6d 73  bly... */.  mems
8100: 65 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 44 61  et(&pData->p[pDa
8110: 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35  ta->nn], 0, FTS5
8120: 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a  _DATA_PADDING);.
8130: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
8140: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
8150: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
8160: 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52  n, &iCookie, &pR
8170: 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  et);.  if( p->rc
8180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8190: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21  Config->iCookie!
81a0: 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  =iCookie ){.    
81b0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
81c0: 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43  ts5ConfigLoad(pC
81d0: 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b  onfig, iCookie);
81e0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
81f0: 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
8200: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
8210: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
8220: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8230: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
8240: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
8250: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
8260: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
8270: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8280: 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
8290: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
82a0: 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ct. This.** func
82b0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
82c0: 72 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  r used as part o
82d0: 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69  f assert() condi
82e0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tions..*/.#ifdef
82f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
8300: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 72  atic int fts5Str
8310: 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
8320: 6e 74 73 28 46 74 73 35 53 74 72 75 63 74 75 72  nts(Fts5Structur
8330: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
8340: 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b  nt nSegment = 0;
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8360: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
8370: 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  f segments */.  
8380: 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
8390: 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
83c0: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
83d0: 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c  ls */.    for(iL
83e0: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
83f0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
8400: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d  ++){.      nSegm
8410: 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e  ent += pStruct->
8420: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
8430: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
8440: 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b  return nSegment;
8450: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
8460: 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73   Serialize and s
8470: 74 6f 72 65 20 74 68 65 20 22 73 74 72 75 63 74  tore the "struct
8480: 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ure" record..**.
8490: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
84a0: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
84b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68  error code in th
84c0: 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  e Fts5Index obje
84d0: 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  ct. If an.** err
84e0: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
84f0: 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
8500: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
8510: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
8520: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57  d fts5StructureW
8530: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
8540: 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  p, Fts5Structure
8550: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66   *pStruct){.  if
8560: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8570: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75  OK ){.    Fts5Bu
8580: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
8590: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
85a0: 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72  r to serialize r
85b0: 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20  ecord into */.  
85c0: 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
85f0: 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
8600: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  s */.    int iCo
8610: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
8620: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65         /* Cookie
8630: 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20   value to store 
8640: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
8650: 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
8660: 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
8670: 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
8680: 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65  truct) );.    me
8690: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
86a0: 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
86b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
86c0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  d the current co
86d0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
86e0: 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69  ie */.    iCooki
86f0: 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  e = p->pConfig->
8700: 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28  iCookie;.    if(
8710: 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f   iCookie<0 ) iCo
8720: 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20 20 66 74  okie = 0;.    ft
8730: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33 32  s5BufferAppend32
8740: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 69  (&p->rc, &buf, i
8750: 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20 20 66 74  Cookie);..    ft
8760: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8770: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
8780: 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f, pStruct->nLev
8790: 65 6c 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  el);.    fts5Buf
87a0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
87b0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
87c0: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29  truct->nSegment)
87d0: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
87e0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
87f0: 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34 29  >rc, &buf, (i64)
8800: 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
8810: 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f  ounter);..    fo
8820: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8830: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8840: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iLvl++){.      i
8850: 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  nt iSeg;        
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8870: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
8880: 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73  through segments
8890: 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74   */.      Fts5St
88a0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
88b0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
88c0: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
88d0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
88e0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
88f0: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d  , &buf, pLvl->nM
8900: 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73  erge);.      fts
8910: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8920: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8930: 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20  , pLvl->nSeg);. 
8940: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76       assert( pLv
8950: 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d  l->nMerge<=pLvl-
8960: 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20  >nSeg );..      
8970: 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
8980: 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
8990: 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74  g++){.        ft
89a0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
89b0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
89c0: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
89d0: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
89e0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
89f0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8a00: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
8a10: 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46  aSeg[iSeg].pgnoF
8a20: 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  irst);.        f
8a30: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8a40: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8a50: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
8a60: 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg].pgnoLast);.
8a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8a80: 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
8a90: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
8aa0: 52 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c  RE_ROWID, buf.p,
8ab0: 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73   buf.n);.    fts
8ac0: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
8ad0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a  );.  }.}..#if 0.
8ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8af0: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69  DebugStructure(i
8b00: 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c  nt*,Fts5Buffer*,
8b10: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b  Fts5Structure*);
8b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8b30: 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28  5PrintStructure(
8b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70  const char *zCap
8b50: 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74  tion, Fts5Struct
8b60: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
8b70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8b80: 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65  _OK;.  Fts5Buffe
8b90: 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28  r buf;.  memset(
8ba0: 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &buf, 0, sizeof(
8bb0: 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62  buf));.  fts5Deb
8bc0: 75 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c  ugStructure(&rc,
8bd0: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b   &buf, pStruct);
8be0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75  .  fprintf(stdou
8bf0: 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a  t, "%s: %s\n", z
8c00: 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b  Caption, buf.p);
8c10: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
8c20: 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
8c30: 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c  ree(&buf);.}.#el
8c40: 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  se.# define fts5
8c50: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78  PrintStructure(x
8c60: 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,y).#endif..stat
8c70: 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65  ic int fts5Segme
8c80: 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63  ntSize(Fts5Struc
8c90: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
8ca0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b  g){.  return 1 +
8cb0: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
8cc0: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
8cd0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
8ce0: 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64  rn a copy of ind
8cf0: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
8d00: 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72  ruct. Except, pr
8d10: 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a  omote as many .*
8d20: 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f  * segments as po
8d30: 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20  ssible to level 
8d40: 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20  iPromote. If an 
8d50: 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  OOM occurs, NULL
8d60: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
8d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8d80: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
8d90: 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49  omoteTo(.  Fts5I
8da0: 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69  ndex *p,.  int i
8db0: 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73  Promote,.  int s
8dc0: 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35  zPromote,.  Fts5
8dd0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8de0: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20  ct.){.  int il, 
8df0: 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  is;.  Fts5Struct
8e00: 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d  ureLevel *pOut =
8e10: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
8e20: 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20  l[iPromote];..  
8e30: 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65  if( pOut->nMerge
8e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
8e50: 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c  l=iPromote+1; il
8e60: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8e70: 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  ; il++){.      F
8e80: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
8e90: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
8ea0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a  ct->aLevel[il];.
8eb0: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
8ec0: 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b  nMerge ) return;
8ed0: 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c  .      for(is=pL
8ee0: 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d  vl->nSeg-1; is>=
8ef0: 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20  0; is--){.      
8f00: 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53    int sz = fts5S
8f10: 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c  egmentSize(&pLvl
8f20: 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20  ->aSeg[is]);.   
8f30: 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72       if( sz>szPr
8f40: 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a  omote ) return;.
8f50: 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75          fts5Stru
8f60: 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
8f70: 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
8f80: 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31  , iPromote, 1, 1
8f90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
8fa0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
8fb0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f         memcpy(pO
8fc0: 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  ut->aSeg, &pLvl-
8fd0: 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f  >aSeg[is], sizeo
8fe0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8ff0: 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20  egment));.      
9000: 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a    pOut->nSeg++;.
9010: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53          pLvl->nS
9020: 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eg--;.      }.  
9030: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9040: 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68   A new segment h
9050: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69  as just been wri
9060: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c  tten to level iL
9070: 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  vl of index stru
9080: 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74  cture.** pStruct
9090: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
90a0: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e  determines if an
90b0: 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c  y segments shoul
90c0: 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a  d be promoted.**
90d0: 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65   as a result. Se
90e0: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
90f0: 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  ted in two scena
9100: 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
9110: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9120: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9130: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65  smaller than one
9140: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
9150: 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e  s.**      within
9160: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f   the previous po
9170: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69  pulated level, i
9180: 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f  t is promoted to
9190: 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a   the previous.**
91a0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
91b0: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62  level..**.**   b
91c0: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
91d0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
91e0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
91f0: 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20   newest segment 
9200: 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e  on.**      the n
9210: 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65  ext populated le
9220: 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73  vel, then that s
9230: 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20  egment, and any 
9240: 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a  other adjacent.*
9250: 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20  *      segments 
9260: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d  that are also sm
9270: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f  aller than the o
9280: 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  ne just written,
9290: 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72   are .**      pr
92a0: 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  omoted. .**.** I
92b0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65  f one or more se
92c0: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
92d0: 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75  ted, the structu
92e0: 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64  re object is upd
92f0: 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65  ated.** to refle
9300: 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  ct this..*/.stat
9310: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
9320: 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20  cturePromote(.  
9330: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
9360: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
9370: 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
9380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9390: 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20  ndex level just 
93a0: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73  updated */.  Fts
93b0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
93c0: 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uct          /* 
93d0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
93e0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
93f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9400: 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20      int iTst;.  
9410: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d    int iPromote =
9420: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50   -1;.    int szP
9430: 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20  romote = 0;     
9440: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74         /* Promot
9450: 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20  e anything this 
9460: 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20  size or smaller 
9470: 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  */.    Fts5Struc
9480: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
9490: 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20  g;   /* Segment 
94a0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
94b0: 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20      int szSeg;  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67    /* Size of seg
94e0: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
94f0: 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  n */.    int nSe
9500: 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  g = pStruct->aLe
9510: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
9520: 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30  .    if( nSeg==0
9530: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
9540: 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Seg = &pStruct->
9550: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
9560: 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g[pStruct->aLeve
9570: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b  l[iLvl].nSeg-1];
9580: 0a 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20  .    szSeg = (1 
9590: 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  + pSeg->pgnoLast
95a0: 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   - pSeg->pgnoFir
95b0: 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  st);..    /* Che
95c0: 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e  ck for condition
95d0: 20 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28   (a) */.    for(
95e0: 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73  iTst=iLvl-1; iTs
95f0: 74 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d  t>=0 && pStruct-
9600: 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53  >aLevel[iTst].nS
9610: 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a  eg==0; iTst--);.
9620: 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20      if( iTst>=0 
9630: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
9640: 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20        int szMax 
9650: 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53  = 0;.      Fts5S
9660: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
9670: 54 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Tst = &pStruct->
9680: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20  aLevel[iTst];.  
9690: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74      assert( pTst
96a0: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20  ->nMerge==0 );. 
96b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
96c0: 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  pTst->nSeg; i++)
96d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
96e0: 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   = pTst->aSeg[i]
96f0: 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74  .pgnoLast - pTst
9700: 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69  ->aSeg[i].pgnoFi
9710: 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  rst + 1;.       
9720: 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20   if( sz>szMax ) 
9730: 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20  szMax = sz;.    
9740: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a    }.      if( sz
9750: 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20  Max>=szSeg ){.  
9760: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69        /* Conditi
9770: 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20  on (a) is true. 
9780: 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65  Promote the newe
9790: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65  st segment on le
97a0: 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  vel .        ** 
97b0: 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54  iLvl to level iT
97c0: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
97d0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b  iPromote = iTst;
97e0: 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f  .        szPromo
97f0: 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20  te = szMax;.    
9800: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9810: 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28  * If condition (
9820: 61 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61  a) is not met, a
9830: 73 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75  ssume (b) is tru
9840: 65 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d  e. StructureProm
9850: 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69  oteTo().    ** i
9860: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20  s a no-op if it 
9870: 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20  is not.  */.    
9880: 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29  if( iPromote<0 )
9890: 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65  {.      iPromote
98a0: 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73   = iLvl;.      s
98b0: 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67  zPromote = szSeg
98c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
98d0: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
98e0: 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  To(p, iPromote, 
98f0: 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75  szPromote, pStru
9900: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
9910: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
9920: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
9930: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
9940: 65 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20  ent. If the end 
9950: 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69  of the .** docli
9960: 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73  st-index page is
9970: 20 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e   reached, return
9980: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
9990: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
99a0: 64 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c  dxLvlNext(Fts5Dl
99b0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20  idxLvl *pLvl){. 
99c0: 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
99d0: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a   = pLvl->pData;.
99e0: 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66  .  if( pLvl->iOf
99f0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
9a00: 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d  rt( pLvl->bEof==
9a10: 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  0 );.    pLvl->i
9a20: 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76  Off = 1;.    pLv
9a30: 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  l->iOff += fts5G
9a40: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
9a50: 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69  a->p[1], pLvl->i
9a60: 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70  LeafPgno);.    p
9a70: 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  Lvl->iOff += fts
9a80: 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
9a90: 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d  a->p[pLvl->iOff]
9aa0: 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69  , (u64*)&pLvl->i
9ab0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c  Rowid);.    pLvl
9ac0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c  ->iFirstOff = pL
9ad0: 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73  vl->iOff;.  }els
9ae0: 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  e{.    int iOff;
9af0: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c  .    for(iOff=pL
9b00: 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70  vl->iOff; iOff<p
9b10: 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b  Data->nn; iOff++
9b20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  ){.      if( pDa
9b30: 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72  ta->p[iOff] ) br
9b40: 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20  eak; .    }..   
9b50: 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d   if( iOff<pData-
9b60: 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  >nn ){.      i64
9b70: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76   iVal;.      pLv
9b80: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  l->iLeafPgno += 
9b90: 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f  (iOff - pLvl->iO
9ba0: 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69  ff) + 1;.      i
9bb0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
9bc0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
9bd0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
9be0: 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  l);.      pLvl->
9bf0: 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
9c00: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66        pLvl->iOff
9c10: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c   = iOff;.    }el
9c20: 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  se{.      pLvl->
9c30: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
9c40: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
9c50: 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a  vl->bEof;.}../*.
9c60: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
9c70: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
9c80: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
9c90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
9ca0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
9cb0: 4e 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20  NextR(Fts5Index 
9cc0: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
9cd0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c  r *pIter, int iL
9ce0: 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  vl){.  Fts5Dlidx
9cf0: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
9d00: 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a  er->aLvl[iLvl];.
9d10: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
9d20: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20  pIter->nLvl );. 
9d30: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76   if( fts5DlidxLv
9d40: 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20  lNext(pLvl) ){. 
9d50: 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20     if( (iLvl+1) 
9d60: 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b  < pIter->nLvl ){
9d70: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
9d80: 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74  IterNextR(p, pIt
9d90: 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20  er, iLvl+1);.   
9da0: 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62     if( pLvl[1].b
9db0: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
9dc0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
9dd0: 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
9de0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
9df0: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
9e00: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
9e10: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61         pLvl->pDa
9e20: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
9e30: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
9e40: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
9e50: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
9e60: 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e  , iLvl, pLvl[1].
9e70: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
9e80: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
9e90: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20  ( pLvl->pData ) 
9ea0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
9eb0: 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  (pLvl);.      }.
9ec0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9ed0: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
9ee0: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69  0].bEof;.}.stati
9ef0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
9f00: 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
9f10: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
9f20: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
9f30: 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49  eturn fts5DlidxI
9f40: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
9f50: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
9f60: 54 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  The iterator pas
9f70: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
9f80: 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68   argument has th
9f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
9fa0: 64 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c  ds set.** as fol
9fb0: 6c 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74  lows. This funct
9fc0: 69 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20  ion sets up the 
9fd0: 72 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72  rest of the iter
9fe0: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a  ator so that it.
9ff0: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
a000: 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
a010: 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
a020: 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61  x..**.**   pData
a030: 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72  :.**     pointer
a040: 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   to doclist-inde
a050: 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a  x record, .**.**
a060: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
a070: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49  ion is called pI
a080: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69  ter->iLeafPgno i
a090: 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
a0a0: 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74  r the.** doclist
a0b0: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
a0c0: 69 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61  ith (the one fea
a0d0: 74 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29  turing the term)
a0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a0f0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
a100: 73 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  st(Fts5DlidxIter
a110: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
a120: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
a130: 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b  pIter->nLvl; i++
a140: 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78  ){.    fts5Dlidx
a150: 4c 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e  LvlNext(&pIter->
a160: 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  aLvl[i]);.  }.  
a170: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
a180: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a  vl[0].bEof;.}...
a190: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a1a0: 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35  lidxIterEof(Fts5
a1b0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
a1c0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
a1d0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21  .  return p->rc!
a1e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
a1f0: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
a200: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  f;.}..static voi
a210: 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c  d fts5DlidxIterL
a220: 61 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ast(Fts5Index *p
a230: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
a240: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
a250: 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  ;..  /* Advance 
a260: 65 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68  each level to th
a270: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20  e last entry on 
a280: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f  the last page */
a290: 0a 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e  .  for(i=pIter->
a2a0: 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53  nLvl-1; p->rc==S
a2b0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30  QLITE_OK && i>=0
a2c0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35  ; i--){.    Fts5
a2d0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
a2e0: 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d   &pIter->aLvl[i]
a2f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73  ;.    while( fts
a300: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
a310: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  vl)==0 );.    pL
a320: 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20  vl->bEof = 0;.. 
a330: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
a340: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
a350: 20 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c   *pChild = &pLvl
a360: 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  [-1];.      fts5
a370: 44 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69  DataRelease(pChi
a380: 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  ld->pData);.    
a390: 20 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c    memset(pChild,
a3a0: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
a3b0: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
a3c0: 20 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d   pChild->pData =
a3d0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
a3e0: 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35   .          FTS5
a3f0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
a400: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c  er->iSegid, i-1,
a410: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a420: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
a430: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  .  }.}../*.** Mo
a440: 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
a450: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a460: 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ly argument to t
a470: 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
a480: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
a490: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65   fts5DlidxLvlPre
a4a0: 76 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a  v(Fts5DlidxLvl *
a4b0: 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66  pLvl){.  int iOf
a4c0: 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a  f = pLvl->iOff;.
a4d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
a4e0: 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66  >bEof==0 );.  if
a4f0: 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46  ( iOff<=pLvl->iF
a500: 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70  irstOff ){.    p
a510: 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  Lvl->bEof = 1;. 
a520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a   }else{.    u8 *
a530: 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d  a = pLvl->pData-
a540: 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c  >p;.    i64 iVal
a550: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
a560: 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
a570: 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b    int nZero = 0;
a580: 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
a590: 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74  ly iOff points t
a5a0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
a5b0: 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68   of a varint. Th
a5c0: 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  is block .    **
a5d0: 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66   decrements iOff
a5e0: 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
a5f0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
a600: 74 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  te of the previo
a610: 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e  us .    ** varin
a620: 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e  t. Taking care n
a630: 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d  ot to read any m
a640: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
a650: 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a  that occur.    *
a660: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  * before the buf
a670: 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  fer in memory.  
a680: 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  */.    iLimit = 
a690: 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39  (iOff>9 ? iOff-9
a6a0: 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 0);.    for(i
a6b0: 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d  Off--; iOff>iLim
a6c0: 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20  it; iOff--){.   
a6d0: 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31     if( (a[iOff-1
a6e0: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62  ] & 0x80)==0 ) b
a6f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a700: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
a710: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
a720: 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  iVal);.    pLvl-
a730: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b  >iRowid -= iVal;
a740: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  .    pLvl->iLeaf
a750: 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20  Pgno--;..    /* 
a760: 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70  Skip backwards p
a770: 61 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72  ast any 0x00 var
a780: 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ints. */.    for
a790: 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d  (ii=iOff-1; ii>=
a7a0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
a7b0: 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20  && a[ii]==0x00; 
a7c0: 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65  ii--){.      nZe
a7d0: 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ro++;.    }.    
a7e0: 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46  if( ii>=pLvl->iF
a7f0: 69 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69  irstOff && (a[ii
a800: 5d 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20  ] & 0x80) ){.   
a810: 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69     /* The byte i
a820: 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72  mmediately befor
a830: 65 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20  e the last 0x00 
a840: 62 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38  byte has the 0x8
a850: 30 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73  0 bit.      ** s
a860: 65 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20  et. So the last 
a870: 30 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76  0x00 is only a v
a880: 61 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65  arint 0 if there
a890: 20 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30   are 8 more 0x80
a8a0: 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
a8b0: 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f  before a[ii]. */
a8c0: 0a 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f  .      int bZero
a8d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a8e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61     /* True if la
a8f0: 73 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a  st 0x00 counts *
a900: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d  /.      if( (ii-
a910: 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  8)>=pLvl->iFirst
a920: 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
a930: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
a940: 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28  r(j=1; j<=8 && (
a950: 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b  a[ii-j] & 0x80);
a960: 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62   j++);.        b
a970: 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20  Zero = (j>8);.  
a980: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a990: 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f  bZero==0 ) nZero
a9a0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  --;.    }.    pL
a9b0: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d  vl->iLeafPgno -=
a9c0: 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c   nZero;.    pLvl
a9d0: 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20  ->iOff = iOff - 
a9e0: 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65  nZero;.  }..  re
a9f0: 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b  turn pLvl->bEof;
aa00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
aa10: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aa20: 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  R(Fts5Index *p, 
aa30: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
aa40: 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b  Iter, int iLvl){
aa50: 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  .  Fts5DlidxLvl 
aa60: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
aa70: 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61  aLvl[iLvl];..  a
aa80: 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65  ssert( iLvl<pIte
aa90: 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28  r->nLvl );.  if(
aaa0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65   fts5DlidxLvlPre
aab0: 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69  v(pLvl) ){.    i
aac0: 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49  f( (iLvl+1) < pI
aad0: 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20  ter->nLvl ){.   
aae0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
aaf0: 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20  PrevR(p, pIter, 
ab00: 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69  iLvl+1);.      i
ab10: 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d  f( pLvl[1].bEof=
ab20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
ab30: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
ab40: 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  vl->pData);.    
ab50: 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c      memset(pLvl,
ab60: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
ab70: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
ab80: 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
ab90: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
aba0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54   .            FT
abb0: 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
abc0: 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c  Iter->iSegid, iL
abd0: 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61  vl, pLvl[1].iLea
abe0: 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  fPgno).        )
abf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
ac00: 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20  vl->pData ){.   
ac10: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74         while( ft
ac20: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
ac30: 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lvl)==0 );.     
ac40: 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20       pLvl->bEof 
ac50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
ac60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ac70: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
ac80: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
ac90: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
aca0: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46  5DlidxIterPrev(F
acb0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
acc0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
acd0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  r){.  return fts
ace0: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28  5DlidxIterPrevR(
acf0: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a  p, pIter, 0);.}.
ad00: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f  ./*.** Free a do
ad10: 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72  clist-index iter
ad20: 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f  ator object allo
ad30: 63 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69  cated by fts5Dli
ad40: 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f  dxIterInit()..*/
ad50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ad60: 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46  5DlidxIterFree(F
ad70: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
ad80: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
ad90: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
ada0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
adb0: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
adc0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
add0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61  Release(pIter->a
ade0: 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20  Lvl[i].pData);. 
adf0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ae00: 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
ae10: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  }.}..static Fts5
ae20: 44 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44  DlidxIter *fts5D
ae30: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20  lidxIterInit(.  
ae40: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20  /* Fts5 Backend 
ae70: 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
ae80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  n */.  int bRev,
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
aeb0: 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20  or ORDER BY ASC 
aec0: 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  */.  int iSegid,
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
aef0: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  id */.  int iLea
af00: 66 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20  fPg             
af10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20          /* Leaf 
af20: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c  page number to l
af30: 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f  oad dlidx for */
af40: 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
af50: 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a  ter *pIter = 0;.
af60: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
af70: 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  Done = 0;..  for
af80: 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
af90: 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d  ITE_OK && bDone=
afa0: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  =0; i++){.    in
afb0: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
afc0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 20  (Fts5DlidxIter) 
afd0: 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  + i * sizeof(Fts
afe0: 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20  5DlidxLvl);.    
aff0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b000: 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d  New;..    pNew =
b010: 20 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a   (Fts5DlidxIter*
b020: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
b030: 28 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a  (pIter, nByte);.
b040: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
b050: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
b060: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b080: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
b090: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53  5_DLIDX_ROWID(iS
b0a0: 65 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67  egid, i, iLeafPg
b0b0: 29 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  );.      Fts5Dli
b0c0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
b0d0: 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  New->aLvl[i];.  
b0e0: 20 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77      pIter = pNew
b0f0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
b100: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
b110: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
b120: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
b130: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
b140: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
b150: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
b160: 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74  a && (pLvl->pDat
b170: 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31  a->p[0] & 0x0001
b180: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
b190: 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
b1a0: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
b1b0: 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20  nLvl = i+1;.    
b1c0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
b1d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b1e0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67  .    pIter->iSeg
b1f0: 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
b200: 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
b210: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
b220: 74 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b  terFirst(pIter);
b230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b240: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c    fts5DlidxIterL
b250: 61 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ast(p, pIter);. 
b260: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
b270: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
b280: 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64   ){.    fts5Dlid
b290: 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29  xIterFree(pIter)
b2a0: 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b  ;.    pIter = 0;
b2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b2c0: 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Iter;.}..static 
b2d0: 69 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65  i64 fts5DlidxIte
b2e0: 72 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78  rRowid(Fts5Dlidx
b2f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b300: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
b310: 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a  vl[0].iRowid;.}.
b320: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
b330: 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73  lidxIterPgno(Fts
b340: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b350: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74  r){.  return pIt
b360: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61  er->aLvl[0].iLea
b370: 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fPgno;.}../*.** 
b380: 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65  Load the next le
b390: 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  af page into the
b3a0: 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
b3b0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b3c0: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
b3d0: 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64  tPage(.  Fts5Ind
b3e0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
b3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
b400: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
b410: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
b420: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
b430: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
b440: 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e   to advance to n
b450: 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  ext page */.){. 
b460: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
b470: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
b480: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
b490: 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20   pIter->pSeg;.  
b4a0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
b4b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
b4c0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b4d0: 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72  o++;.  if( pIter
b4e0: 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20  ->pNextLeaf ){. 
b4f0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b500: 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  = pIter->pNextLe
b510: 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  af;.    pIter->p
b520: 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20  NextLeaf = 0;.  
b530: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
b540: 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67  >iLeafPgno<=pSeg
b550: 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
b560: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
b570: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
b580: 20 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53   .        FTS5_S
b590: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
b5a0: 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72  g->iSegid, pIter
b5b0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ->iLeafPgno).   
b5c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
b5d0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
b5e0: 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d  0;.  }.  pLeaf =
b5f0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a   pIter->pLeaf;..
b600: 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
b610: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
b620: 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  Off = pLeaf->szL
b630: 65 61 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73  eaf;.    if( fts
b640: 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
b650: 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  pLeaf) ){.      
b660: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
b670: 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e  list = pLeaf->nn
b680: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
b690: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
b6a0: 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
b6b0: 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
b6c0: 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78  >p[pIter->iPgidx
b6d0: 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  Off],.          
b6e0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
b6f0: 6c 69 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  list.      );.  
b700: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b710: 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   Argument p poin
b720: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
b730: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69  ontaining a vari
b740: 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72  nt to be interpr
b750: 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73  eted as a.** pos
b760: 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
b770: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
b780: 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72  varint and retur
b790: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b7a0: 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42  bytes.** read. B
b7b0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
b7c0: 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68   set *pnSz to th
b7d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
b7e0: 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s in the positio
b7f0: 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a  n.** list, and *
b800: 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66  pbDel to true if
b810: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
b820: 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73   is set, or fals
b830: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
b840: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47  static int fts5G
b850: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f  etPoslistSize(co
b860: 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a  nst u8 *p, int *
b870: 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c  pnSz, int *pbDel
b880: 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20  ){.  int nSz;.  
b890: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73  int n = 0;.  fts
b8a0: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
b8b0: 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61  (p, n, nSz);.  a
b8c0: 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30  ssert_nc( nSz>=0
b8d0: 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53   );.  *pnSz = nS
b8e0: 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20  z/2;.  *pbDel = 
b8f0: 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20  nSz & 0x0001;.  
b900: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
b910: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
b920: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
b930: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
b940: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b950: 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c   a.** position-l
b960: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
b970: 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
b980: 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20  f the field and 
b990: 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74  store it.** in t
b9a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
b9b0: 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
b9c0: 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73  Fts5SegIter.nPos
b9d0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
b9e0: 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61  r.bDel.**.** Lea
b9f0: 76 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ve Fts5SegIter.i
ba00: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
ba10: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
ba20: 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a   byte of the .**
ba30: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
ba40: 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e  ontent (if any).
ba50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ba60: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
ba70: 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Pos(Fts5Index *p
ba80: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
ba90: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
baa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bab0: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
bac0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
bad0: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
bae0: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20  o read at */.   
baf0: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 41 53   int nSz;.    AS
bb00: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
bb10: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bb20: 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
bb30: 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65  int32(pIter->pLe
bb40: 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a  af->p, iOff, nSz
bb50: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44  );.    pIter->bD
bb60: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
bb70: 30 31 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01);.    pIter->
bb80: 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20  nPos = nSz>>1;. 
bb90: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
bba0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
bbb0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
bbc0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
bbd0: 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20  Rowid(Fts5Index 
bbe0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
bbf0: 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61  *pIter){.  u8 *a
bc00: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
bc10: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
bc20: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
bc30: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
bc40: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
bc50: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53  eafOffset;..  AS
bc60: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
bc70: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bc80: 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d  if( iOff>=pIter-
bc90: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
bca0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
bcb0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
bcc0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
bcd0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
bce0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
bcf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
bd00: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
bd10: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
bd20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
bd30: 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74  = 4;.    a = pIt
bd40: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
bd50: 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69  }.  iOff += sqli
bd60: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
bd70: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
bd80: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
bd90: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
bda0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d  Offset = iOff;.}
bdb0: 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49  ../*.** Fts5SegI
bdc0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
bdd0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
bde0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
bdf0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e  te of the .** "n
be00: 53 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66  Suffix" field of
be10: 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f   a term. Functio
be20: 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65  n parameter nKee
be30: 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  p contains the v
be40: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22  alue.** of the "
be50: 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64 20 28  nPrefix" field (
be60: 69 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65  if there was one
be70: 20 2d 20 69 74 20 69 73 20 70 61 73 73 65 64 20   - it is passed 
be80: 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20  0 if this is.** 
be90: 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69  the first term i
bea0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a  n the segment)..
beb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
bec0: 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a  ion populates:.*
bed0: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
bee0: 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73  er.term.**   Fts
bef0: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a  5SegIter.rowid.*
bf00: 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  *.** accordingly
bf10: 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73   and leaves (Fts
bf20: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
bf30: 66 73 65 74 29 20 73 65 74 20 74 6f 20 74 68 65  fset) set to the
bf40: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74   content of.** t
bf50: 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f  he first positio
bf60: 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69  n list. The posi
bf70: 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67  tion list belong
bf80: 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20  ing to document 
bf90: 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65 72  .** (Fts5SegIter
bfa0: 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61  .iRowid)..*/.sta
bfb0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
bfc0: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73  IterLoadTerm(Fts
bfd0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
bfe0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
bff0: 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20  nt nKeep){.  u8 
c000: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
c010: 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  f->p;        /* 
c020: 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64  Buffer to read d
c030: 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ata from */.  in
c040: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
c050: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a  iLeafOffset;  /*
c060: 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20   Offset to read 
c070: 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  at */.  int nNew
c080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c090: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
c0a0: 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a   of new data */.
c0b0: 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  .  iOff += fts5G
c0c0: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
c0d0: 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49  ff], nNew);.  pI
c0e0: 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b  ter->term.n = nK
c0f0: 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65  eep;.  fts5Buffe
c100: 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
c110: 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
c120: 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d  , nNew, &a[iOff]
c130: 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65  );.  iOff += nNe
c140: 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  w;.  pIter->iTer
c150: 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  mLeafOffset = iO
c160: 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65  ff;.  pIter->iTe
c170: 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74  rmLeafPgno = pIt
c180: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
c190: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c1a0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69  set = iOff;..  i
c1b0: 66 28 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78  f( pIter->iPgidx
c1c0: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
c1d0: 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74  f->nn ){.    pIt
c1e0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
c1f0: 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  t = pIter->pLeaf
c200: 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->nn+1;.  }else{
c210: 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  .    int nExtra;
c220: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
c230: 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
c240: 56 61 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65  Varint32(&a[pIte
c250: 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  r->iPgidxOff], n
c260: 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65  Extra);.    pIte
c270: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
c280: 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a   += nExtra;.  }.
c290: 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
c2a0: 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72  adRowid(p, pIter
c2b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
c2c0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
c2d0: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
c2e0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
c2f0: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
c300: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
c310: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
c320: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
c330: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
c340: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
c350: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
c360: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
c370: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
c380: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
c390: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
c3a0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
c3b0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
c3c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
c3d0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
c3e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c3f0: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
c400: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
c410: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
c420: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
c430: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
c440: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
c450: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
c460: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
c470: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
c480: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
c490: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
c4a0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4c0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
c4d0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
c4e0: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
c4f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
c500: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
c510: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
c520: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
c530: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
c540: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
c550: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
c560: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
c570: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
c580: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
c590: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
c5a0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
c5b0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
c5c0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
c5d0: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
c5e0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
c5f0: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
c600: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
c610: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
c620: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
c630: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
c640: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
c650: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
c660: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
c670: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c680: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
c690: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
c6a0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70  (*pIter));.    p
c6b0: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
c6c0: 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  g;.    pIter->iL
c6d0: 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  eafPgno = pSeg->
c6e0: 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20  pgnoFirst-1;.   
c6f0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c700: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
c710: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
c720: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c730: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
c740: 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61  ffset = 4;.    a
c750: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
c760: 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a  >pLeaf->nn>4 );.
c770: 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
c780: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
c790: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d  (pIter->pLeaf)==
c7a0: 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  4 );.    pIter->
c7b0: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65  iPgidxOff = pIte
c7c0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
c7d0: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
c7e0: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
c7f0: 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74  Iter, 0);.    ft
c800: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
c810: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  s(p, pIter);.  }
c820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c830: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
c840: 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69  ever called on i
c850: 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64  terators created
c860: 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20   by calls to.** 
c870: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
c880: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e   with the FTS5IN
c890: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66  DEX_QUERY_DESC f
c8a0: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54  lag set..**.** T
c8b0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69  he iterator is i
c8c0: 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61  n an unusual sta
c8d0: 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
c8e0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a  ction is called:
c8f0: 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49   the.** Fts5SegI
c900: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
c910: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
c920: 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  to the offset of
c930: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
c940: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
c950: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f  st size field fo
c960: 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  r the first rele
c970: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
c980: 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53  e page..** Fts5S
c990: 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20  egIter.rowid is 
c9a0: 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e  set, but nPos an
c9b0: 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a  d bDel are not..
c9c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
c9d0: 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65  ion advances the
c9e0: 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
c9f0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
ca00: 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65  he last .** rele
ca10: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
ca20: 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e  e page and, if n
ca30: 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61  ecessary, initia
ca40: 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52  lizes the .** aR
ca50: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64  owidOffset[] and
ca60: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61   iRowidOffset va
ca70: 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73  riables. At this
ca80: 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61   point the itera
ca90: 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73  tor.** is in its
caa0: 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d   regular state -
cab0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
cac0: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
cad0: 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
cae0: 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69  byte of the posi
caf0: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
cb00: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
cb10: 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f  h said rowid..*/
cb20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
cb30: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
cb40: 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65  nitPage(Fts5Inde
cb50: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
cb60: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
cb70: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
cb80: 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74  f->szLeaf;.  int
cb90: 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61   i = pIter->iLea
cba0: 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61  fOffset;.  u8 *a
cbb0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cbc0: 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64  >p;.  int iRowid
cbd0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69  Offset = 0;..  i
cbe0: 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64  f( n>pIter->iEnd
cbf0: 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  ofDoclist ){.   
cc00: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64   n = pIter->iEnd
cc10: 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a  ofDoclist;.  }..
cc20: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
cc30: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
cc40: 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
cc50: 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d      i64 iDelta =
cc60: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   0;.    int nPos
cc70: 3b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79  ;.    int bDummy
cc80: 3b 0a 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  ;..    i += fts5
cc90: 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
cca0: 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  a[i], &nPos, &bD
ccb0: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20  ummy);.    i += 
ccc0: 6e 50 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e  nPos;.    if( i>
ccd0: 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =n ) break;.    
cce0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
ccf0: 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29  nt(&a[i], (u64*)
cd00: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49  &iDelta);.    pI
cd10: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
cd20: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20  Delta;..    if( 
cd30: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49  iRowidOffset>=pI
cd40: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
cd50: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
cd60: 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f  New = pIter->nRo
cd70: 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20  widOffset + 8;. 
cd80: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d       int *aNew =
cd90: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
cda0: 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52  ealloc(pIter->aR
cdb0: 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77  owidOffset, nNew
cdc0: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
cdd0: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
cde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
cdf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
ce00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ce10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ce20: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
ce30: 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  et = aNew;.     
ce40: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
ce50: 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  fset = nNew;.   
ce60: 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
ce70: 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77  RowidOffset[iRow
ce80: 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49  idOffset++] = pI
ce90: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
cea0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
ceb0: 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  afOffset = i;.  
cec0: 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  }.  pIter->iRowi
ced0: 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  dOffset = iRowid
cee0: 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65  Offset;.  fts5Se
cef0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
cf00: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
cf10: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
cf20: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
cf30: 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35 49  rseNewPage(Fts5I
cf40: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
cf50: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
cf60: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
cf70: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
cf80: 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20  TER_REVERSE );. 
cf90: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
cfa0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
cfb0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
cfc0: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
cfd0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
cfe0: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
cff0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
d000: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d010: 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  && pIter->iLeafP
d020: 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d  gno>pIter->iTerm
d030: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
d040: 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a  Fts5Data *pNew;.
d050: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d060: 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77  Pgno--;.    pNew
d070: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
d080: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
d090: 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20  ROWID(.         
d0a0: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
d0b0: 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65  egid, pIter->iLe
d0c0: 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20  afPgno.    ));. 
d0d0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
d0e0: 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61       /* iTermLea
d0f0: 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65 20 65  fOffset may be e
d100: 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69  qual to szLeaf i
d110: 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 74 68  f the term is th
d120: 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
d130: 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  thing on the pag
d140: 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66 69 72  e - i.e. the fir
d150: 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e 20 74  st rowid is on t
d160: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67  he following pag
d170: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  e..      ** In t
d180: 68 69 73 20 63 61 73 65 20 6c 65 61 66 20 70 49  his case leaf pI
d190: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74  ter->pLeaf==0, t
d1a0: 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 73 20  his iterator is 
d1b0: 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20  at EOF. */.     
d1c0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
d1d0: 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54  fPgno==pIter->iT
d1e0: 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20  ermLeafPgno .   
d1f0: 20 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69 54      && pIter->iT
d200: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e  ermLeafOffset<pN
d210: 65 77 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20  ew->szLeaf .    
d220: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74    ){.        pIt
d230: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
d240: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d250: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
d260: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
d270: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  ffset;.      }el
d280: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
d290: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
d2a0: 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
d2b0: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
d2c0: 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  dOff(pNew);.    
d2d0: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
d2e0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
d2f0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
d300: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
d310: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d320: 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
d330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d340: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
d350: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
d360: 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65     u8 *a = &pIte
d370: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  r->pLeaf->p[pIte
d380: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  r->iLeafOffset];
d390: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
d3a0: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66  iLeafOffset += f
d3b0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
d3c0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
d3d0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
d3e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
d3f0: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  e{.        fts5D
d400: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
d410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d420: 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
d430: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70  ->pLeaf ){.    p
d440: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
d450: 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  ist = pIter->pLe
d460: 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74  af->nn+1;.    ft
d470: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
d480: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
d490: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
d4a0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
d4b0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
d4c0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
d4d0: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
d4e0: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
d4f0: 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  o a delete marke
d500: 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b  r. A delete mark
d510: 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77  er is an entry w
d520: 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20  ith a 0 byte.** 
d530: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a  position-list..*
d540: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
d550: 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
d560: 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
d570: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
d580: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
d590: 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
d5a0: 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
d5b0: 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
d5c0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  t];.  return (p-
d5d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
d5e0: 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26  & pSeg->pLeaf &&
d5f0: 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b   pSeg->nPos==0);
d600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
d610: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
d620: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
d630: 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
d640: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d650: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d660: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d670: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d680: 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63   It .** is not c
d690: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
d6a0: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
d6b0: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20  or reaches EOF. 
d6c0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
d6d0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
d6e0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
d6f0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d700: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d720: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d730: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
d740: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d750: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
d760: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
d770: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
d780: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
d790: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
d7a0: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
d7b0: 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d7d0: 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20  UT: Set for new 
d7e0: 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  term */.){.  ass
d7f0: 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d  ert( pbNewTerm==
d800: 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d  0 || *pbNewTerm=
d810: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  =0 );.  if( p->r
d820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d830: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
d840: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
d850: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
d860: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
d870: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  er->pNextLeaf==0
d880: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
d890: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
d8a0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  t>0 ){.        u
d8b0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
d8c0: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20  eaf->p;.        
d8d0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
d8e0: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
d8f0: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
d900: 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
d910: 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74  ta;..        pIt
d920: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
d930: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  --;.        pIte
d940: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d950: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61   iOff = pIter->a
d960: 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65  RowidOffset[pIte
d970: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d  r->iRowidOffset]
d980: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
d990: 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
d9a0: 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26  Size(&a[iOff], &
d9b0: 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
d9c0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d9d0: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 66 74  nPos;.        ft
d9e0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
d9f0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
da00: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49  lta);.        pI
da10: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  ter->iRowid -= i
da20: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 66  Delta;.        f
da30: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
da40: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
da50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da60: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
da70: 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
da80: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
da90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
daa0: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
dab0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
dac0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
dad0: 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
dae0: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
daf0: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20  nt nKeep = 0;.. 
db00: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
db10: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
db20: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
db30: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
db40: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
db50: 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d    u8 *a = pLeaf-
db60: 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
db70: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
db80: 0a 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53  ..      ASSERT_S
db90: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
dba0: 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49  .      iOff = pI
dbb0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dbc0: 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a   + pIter->nPos;.
dbd0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
dbe0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n ){.        /* 
dbf0: 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  The next entry i
dc00: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
dc10: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
dc20: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
dc30: 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f<=pIter->iEndof
dc40: 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 20  Doclist );.     
dc50: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74     if( iOff>=pIt
dc60: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
dc70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  t ){.          b
dc80: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
dc90: 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 21         if( iOff!
dca0: 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65  =fts5LeafFirstTe
dcb0: 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a  rmOff(pLeaf) ){.
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
dcd0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
dce0: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
dcf0: 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eep);.          
dd00: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
dd10: 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20 69  .          u64 i
dd20: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
dd30: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
dd40: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
dd50: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
dd60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
dd70: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
dd80: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 61  lta;.          a
dd90: 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61  ssert_nc( iDelta
dda0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  >0 );.        }.
ddb0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
ddc0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
ddd0: 66 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f;..      }else 
dde0: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
ddf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
de00: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
de10: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  0;.        const
de20: 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30   char *zTerm = 0
de30: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c  ;.        int nL
de40: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
de50: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
de60: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
de70: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c  GITER_ONETERM) |
de80: 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20  | pbNewTerm );. 
de90: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 70         if( 0==(p
dea0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
deb0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
dec0: 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RM) ){.         
ded0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
dee0: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
def0: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  h);.          sq
df00: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
df10: 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
df20: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
df30: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
df40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
df50: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
df60: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
df70: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
df80: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  af);.          p
df90: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
dfa0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dfb0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
dfc0: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
dfd0: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  )pList;.        
dfe0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
dff0: 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  nn = nList;.    
e000: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
e010: 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
e020: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  st;.          pI
e030: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
e040: 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20  st = nList+1;.  
e050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
e060: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
e070: 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
e080: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  m, (int)strlen(z
e090: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
e0a0: 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72 6d 29       (u8*)zTerm)
e0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e0c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e0d0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
e0e0: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
e0f0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
e100: 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72         *pbNewTer
e110: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
e120: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e130: 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a        iOff = 0;.
e140: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
e150: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20  entry is not on 
e160: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e170: 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
e180: 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  e( iOff==0 ){.  
e190: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
e1a0: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
e1b0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
e1c0: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
e1d0: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 20  pLeaf;.         
e1e0: 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
e1f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
e200: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
e210: 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
e220: 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20      if( (iOff = 
e230: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
e240: 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20 26 26  idOff(pLeaf)) &&
e250: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c   iOff<pLeaf->szL
e260: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
e270: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
e280: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
e290: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
e2a0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e2b0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e2c0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e2d0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
e2f0: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
e300: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
e310: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e320: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61  iPgidxOff = pLea
e330: 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35  f->szLeaf + fts5
e340: 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20  GetVarint32(.   
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e360: 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e  pLeaf->p[pLeaf->
e370: 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e  szLeaf], pIter->
e380: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
e3a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
e3b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e3c0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65      else if( pLe
e3d0: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
e3e0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e3f0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
e400: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
e410: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
e420: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
e430: 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
e440: 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d  p[pLeaf->szLeaf]
e450: 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20 20  , iOff.         
e460: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
e470: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e480: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
e490: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e4a0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
e4b0: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
e4c0: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
e4d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e4e0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
e4f0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
e500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
e510: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
e520: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  T;.            r
e530: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
e540: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
e550: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e560: 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65 72  heck if the iter
e570: 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45  ator is now at E
e580: 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  OF. If so, retur
e590: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20  n early. */.    
e5a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
e5b0: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  af ){.        if
e5c0: 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20  ( bNewTerm ){.  
e5d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
e5e0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
e5f0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
e600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
e610: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
e620: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
e630: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e640: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
e650: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e660: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e670: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
e680: 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20  pIter, nKeep);. 
e690: 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
e6a0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
e6b0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
e6c0: 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77 54        if( pbNewT
e6d0: 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d  erm ) *pbNewTerm
e6e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
e6f0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
e700: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
e710: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
e720: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
e730: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e740: 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65  }.  }.}..#define
e750: 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20 62   SWAPVAL(T, a, b
e760: 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61  ) { T tmp; tmp=a
e770: 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a  ; a=b; b=tmp; }.
e780: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
e790: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
e7a0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
e7b0: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64  rst rowid in a d
e7c0: 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20  oclist. This.** 
e7d0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
e7e0: 65 20 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f  e iterator up so
e7f0: 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 69   that iterates i
e800: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
e810: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64  through.** the d
e820: 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  oclist..*/.stati
e830: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
e840: 65 72 52 65 76 65 72 73 65 28 46 74 73 35 49 6e  erReverse(Fts5In
e850: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
e860: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
e870: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
e880: 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
e890: 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74 61  lidx;.  Fts5Data
e8a0: 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69   *pLast = 0;.  i
e8b0: 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
e8c0: 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20 29  ..  if( pDlidx )
e8d0: 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
e8e0: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
e8f0: 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f  iSegid;.    pgno
e900: 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78  Last = fts5Dlidx
e910: 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
e920: 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74  ;.    pLast = ft
e930: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
e940: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
e950: 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73  (iSegid, pgnoLas
e960: 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
e970: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
e980: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
e990: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
e9a0: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
e9b0: 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  /..    /* Curren
e9c0: 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65 72  tly, Fts5SegIter
e9d0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
e9e0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
e9f0: 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20   byte of.    ** 
ea00: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
ea10: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
ea20: 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
ea30: 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74 20  k it up so that 
ea40: 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73  it.    ** points
ea50: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
ea60: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
ea70: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
ea80: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  /.    pIter->iLe
ea90: 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69  afOffset -= sqli
eaa0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
eab0: 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a  Len(pIter->nPos*
eac0: 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a  2+pIter->bDel);.
ead0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
eae0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
eaf0: 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65  e then the large
eb00: 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  st rowid for the
eb10: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
eb20: 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20  term may not be 
eb30: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
eb40: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73  rrent page. So s
eb50: 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f  earch forward to
eb60: 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72  .    ** see wher
eb70: 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61  e said rowid rea
eb80: 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20  lly is.  */.    
eb90: 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  if( pIter->iEndo
eba0: 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d  fDoclist>=pLeaf-
ebb0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
ebc0: 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
ebd0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
ebe0: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
ebf0: 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20  ter->pSeg;..    
ec00: 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f    /* The last ro
ec10: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
ec20: 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e  st may not be on
ec30: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ec40: 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20  e. Search.      
ec50: 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69  ** forward to fi
ec60: 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  nd the page cont
ec70: 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20  aining the last 
ec80: 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20  rowid.  */.     
ec90: 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d   for(pgno=pIter-
eca0: 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70  >iLeafPgno+1; !p
ecb0: 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53  ->rc && pgno<=pS
ecc0: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67  eg->pgnoLast; pg
ecd0: 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  no++){.        i
ece0: 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
ecf0: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
ed00: 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29  g->iSegid, pgno)
ed10: 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44 61  ;.        Fts5Da
ed20: 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44  ta *pNew = fts5D
ed30: 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73 29  ataRead(p, iAbs)
ed40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
ed50: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
ed60: 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72  int iRowid, bTer
ed70: 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20  mless;.         
ed80: 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65   iRowid = fts5Le
ed90: 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
eda0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
edb0: 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73   bTermless = fts
edc0: 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
edd0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
ede0: 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20   if( iRowid ){. 
edf0: 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50 56             SWAPV
ee00: 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e  AL(Fts5Data*, pN
ee10: 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20  ew, pLast);.    
ee20: 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74          pgnoLast
ee30: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20   = pgno;.       
ee40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
ee50: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
ee60: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
ee70: 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30  if( bTermless==0
ee80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ee90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
eea0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
eeb0: 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20  Last is NULL at 
eec0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
eed0: 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   the last rowid 
eee0: 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
eef0: 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68  .  ** lies on th
ef00: 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
ef10: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
ef20: 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74  e iterator. In t
ef30: 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70  his case .  ** p
ef40: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ef50: 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  t is already set
ef60: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
ef70: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
ef80: 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61  ize.  ** field a
ef90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
efa0: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
efb0: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
efc0: 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  age..  **.  ** O
efd0: 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e  r, if pLast is n
efe0: 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
eff0: 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
f000: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
f010: 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20  ast.  ** rowid. 
f020: 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e  In this case con
f030: 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72 61  figure the itera
f040: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  tor so that it p
f050: 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a  oints to the.  *
f060: 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
f070: 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f   this page..  */
f080: 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a  .  if( pLast ){.
f090: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
f0a0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f0b0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f0c0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
f0d0: 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70  f = pLast;.    p
f0e0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
f0f0: 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
f100: 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
f110: 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61  irstRowidOff(pLa
f120: 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  st);.    iOff +=
f130: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
f140: 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLast->p[iOff], 
f150: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
f160: 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72  owid);.    pIter
f170: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f180: 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66  iOff;..    if( f
f190: 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
f1a0: 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20  s(pLast) ){.    
f1b0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
f1c0: 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e  oclist = pLast->
f1d0: 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nn+1;.    }else{
f1e0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
f1f0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74  ndofDoclist = ft
f200: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
f210: 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  ff(pLast);.    }
f220: 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  ..  }..  fts5Seg
f230: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
f240: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  age(p, pIter);.}
f250: 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
f260: 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
f270: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
f280: 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20  irst rowid of a 
f290: 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72  doclist..** Ther
f2a0: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
f2b0: 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
f2c0: 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74  with the final t
f2d0: 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65  erm on the curre
f2e0: 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20  nt .** page. If 
f2f0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
f300: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72   is the last ter
f310: 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c  m on the page, l
f320: 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c  oad the .** docl
f330: 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64  ist-index from d
f340: 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  isk and initiali
f350: 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61  ze an iterator a
f360: 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t (pIter->pDlidx
f370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
f380: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
f390: 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78  dDlidx(Fts5Index
f3a0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
f3b0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
f3c0: 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  iSeg = pIter->pS
f3d0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e  eg->iSegid;.  in
f3e0: 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
f3f0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
f400: 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
f410: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
f420: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
f430: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61  ; /* Current lea
f440: 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73  f data */..  ass
f450: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
f460: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f470: 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
f480: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
f490: 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  idx==0 );..  /* 
f4a0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72  Check if the cur
f4b0: 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64  rent doclist end
f4c0: 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20  s on this page. 
f4d0: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75  If it does, retu
f4e0: 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69  rn.  ** early wi
f4f0: 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68  thout loading th
f500: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
f510: 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74  (as it belongs t
f520: 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20  o a different.  
f530: 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66  ** term. */.  if
f540: 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
f550: 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
f560: 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20  LeafPgno .   && 
f570: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
f580: 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65  list<pLeaf->szLe
f590: 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  af .  ){.    ret
f5a0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65  urn;.  }..  pIte
f5b0: 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35  r->pDlidx = fts5
f5c0: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
f5d0: 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74   bRev, iSeg, pIt
f5e0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
f5f0: 6f 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66  o);.}..#define f
f600: 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69  ts5IndexSkipVari
f610: 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20  nt(a, iOff) {   
f620: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74           \.  int
f630: 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20   iEnd = iOff+9; 
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
f660: 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b   while( (a[iOff+
f670: 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20 69 4f  +] & 0x80) && iO
f680: 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20  ff<iEnd );      
f690: 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   \.}../*.** The 
f6a0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
f6b0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
f6c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75  cond argument cu
f6d0: 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
f6e0: 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c  .** no valid val
f6f0: 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 74  ues except for t
f700: 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 70  he Fts5SegIter.p
f710: 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69  Leaf member vari
f720: 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75  able. This.** fu
f730: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
f740: 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f  the leaf page fo
f750: 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e  r a term matchin
f760: 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e  g (pTerm/nTerm).
f770: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70  .**.** If the sp
f780: 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
f790: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67  found on the pag
f7a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  e, then the iter
f7b0: 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20  ator is left.** 
f7c0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20  pointing to it. 
f7d0: 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20  If argument bGe 
f7e0: 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  is zero and the 
f7f0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e  term is not foun
f800: 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74  d,.** the iterat
f810: 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
f820: 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ing at EOF..**.*
f830: 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d  * If bGe is non-
f840: 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65  zero and the spe
f850: 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e  cified term is n
f860: 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
f870: 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  he.** iterator i
f880: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
f890: 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  to the smallest 
f8a0: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
f8b0: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c  ent that.** is l
f8c0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
f8d0: 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65  pecified term, e
f8e0: 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d  ven if this term
f8f0: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a   is not on the.*
f900: 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a  * current page..
f910: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
f920: 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46  ts5LeafSeek(.  F
f930: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f950: 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f  * Leave any erro
f960: 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20  r code here */. 
f970: 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20   int bGe,       
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e   /* True for a >
f9a0: 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74  = search */.  Ft
f9b0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
f9c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f9d0: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65   Iterator to see
f9e0: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  k */.  const u8 
f9f0: 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
fa00: 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m      /* Term t
fa10: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
fa20: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  ){.  int iOff;. 
fa30: 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70   const u8 *a = p
fa40: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
fa50: 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70    int szLeaf = p
fa60: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
fa70: 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  eaf;.  int n = p
fa80: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b  Iter->pLeaf->nn;
fa90: 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d  ..  int nMatch =
faa0: 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
fab0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  = 0;.  int nNew 
fac0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  = 0;.  int iTerm
fad0: 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64  Off;.  int iPgid
fae0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
faf0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
fb00: 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64  t offset in pgid
fb10: 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f  x */.  int bEndO
fb20: 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  fPage = 0;..  as
fb30: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
fb40: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67  ITE_OK );..  iPg
fb50: 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  idx = szLeaf;.  
fb60: 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
fb70: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
fb80: 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b  idx], iTermOff);
fb90: 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f  .  iOff = iTermO
fba0: 66 66 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20  ff;..  while( 1 
fbb0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  ){..    /* Figur
fbc0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e  e out how many n
fbd0: 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e 20  ew bytes are in 
fbe0: 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
fbf0: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
fc00: 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e  nt32(a, iOff, nN
fc10: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65  ew);.    if( nKe
fc20: 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20  ep<nMatch ){.   
fc30: 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
fc40: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
fc50: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70 3e    assert( nKeep>
fc60: 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20 69  =nMatch );.    i
fc70: 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68  f( nKeep==nMatch
fc80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
fc90: 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  mp;.      int i;
fca0: 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49  .      nCmp = MI
fcb0: 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d  N(nNew, nTerm-nM
fcc0: 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f 72  atch);.      for
fcd0: 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b  (i=0; i<nCmp; i+
fce0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
fcf0: 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d  a[iOff+i]!=pTerm
fd00: 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72 65  [nMatch+i] ) bre
fd10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
fd20: 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a    nMatch += i;..
fd30: 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d        if( nTerm=
fd40: 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  =nMatch ){.     
fd50: 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29     if( i==nNew )
fd60: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
fd70: 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3b   search_success;
fd80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fd90: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
fda0: 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
fdb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
fdc0: 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20 26  lse if( i<nNew &
fdd0: 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72  & a[iOff+i]>pTer
fde0: 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20  m[nMatch] ){.   
fdf0: 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
fe00: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
fe10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
fe20: 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20  iPgidx>=n ){.   
fe30: 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20     bEndOfPage = 
fe40: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
fe50: 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69 64      }..    iPgid
fe60: 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  x += fts5GetVari
fe70: 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c  nt32(&a[iPgidx],
fe80: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54 65   nKeep);.    iTe
fe90: 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a  rmOff += nKeep;.
fea0: 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
feb0: 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Off;..    /* Rea
fec0: 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c  d the nKeep fiel
fed0: 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65  d of the next te
fee0: 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46  rm. */.    fts5F
fef0: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61  astGetVarint32(a
ff00: 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a  , iOff, nKeep);.
ff10: 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69    }.. search_fai
ff20: 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d  led:.  if( bGe==
ff30: 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74  0 ){.    fts5Dat
ff40: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
ff50: 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
ff60: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
ff70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
ff80: 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65  e if( bEndOfPage
ff90: 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
ffa0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
ffb0: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
ffc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
ffd0: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  r->pLeaf==0 ) re
ffe0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20  turn;.      a = 
fff0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
10000 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c  .      if( fts5L
10010 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49  eafIsTermless(pI
10020 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29  ter->pLeaf)==0 )
10030 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65  {.        fts5Ge
10040 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
10050 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72  ->pLeaf->p[pIter
10060 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d  ->pLeaf->szLeaf]
10070 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  , iOff);.       
10080 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
10090 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
100a0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
100b0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
100c0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
100d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
100e0 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b        nKeep = 0;
100f0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
10100 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
10110 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65  32(&a[iOff], nNe
10120 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  w);.          br
10130 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
10140 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
10150 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65  e( 1 );.  }.. se
10160 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20  arch_success:.. 
10170 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
10180 73 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65  set = iOff + nNe
10190 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  w;.  pIter->iTer
101a0 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  mLeafOffset = pI
101b0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
101c0 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
101d0 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
101e0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20  ->iLeafPgno;..  
101f0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
10200 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
10210 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d  rm, nKeep, pTerm
10220 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
10230 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
10240 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
10250 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  nNew, &a[iOff]);
10260 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d  ..  if( iPgidx>=
10270 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  n ){.    pIter->
10280 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
10290 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
102a0 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
102b0 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20   int nExtra;.   
102c0 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
102d0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
102e0 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a  gidx], nExtra);.
102f0 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
10300 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d  fDoclist = iTerm
10310 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20  Off + nExtra;.  
10320 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64  }.  pIter->iPgid
10330 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a  xOff = iPgidx;..
10340 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
10350 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29  dRowid(p, pIter)
10360 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ;.  fts5SegIterL
10370 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
10380 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
10390 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
103a0 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
103b0 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
103c0 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
103d0 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20  ent.** pSeg. If 
103e0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
103f0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64   term in the ind
10400 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  ex, the iterator
10410 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a   is set to EOF..
10420 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
10430 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
10440 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
10450 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
10460 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
10470 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
10480 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
10490 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
104a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
104b0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
104c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
104d0 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
104e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
104f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10500 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
10510 65 6e 64 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  end */.  Fts5Buf
10520 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
10530 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
10540 65 72 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f  er to use for lo
10550 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  ading pages */. 
10560 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
10570 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
10580 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
10590 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   to */.  int fla
105a0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
105b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
105c0 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58   of FTS5INDEX_XX
105d0 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
105e0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
105f0 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
10600 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73  Description of s
10610 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
10620 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
10630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10640 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
10650 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50  e */.){.  int iP
10660 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65  g = 1;.  int bGe
10670 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35   = (flags & FTS5
10680 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
10690 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20  );.  int bDlidx 
106a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
106b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
106c0 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  there is a docli
106d0 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 73  st-index */..  s
106e0 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20  tatic int nCall 
106f0 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a  = 0;.  nCall++;.
10700 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d  .  assert( bGe==
10710 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
10720 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
10730 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
10740 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
10750 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
10760 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
10770 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
10780 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
10790 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
107a0 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69   sets stack vari
107b0 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20  able iPg to the 
107c0 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
107d0 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63   that may.  ** c
107e0 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65  ontain term (pTe
107f0 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74  rm/nTerm), if it
10800 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
10810 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  he segment. */. 
10820 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65   if( p->pIdxSele
10830 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  ct==0 ){.    Fts
10840 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
10850 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
10860 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
10870 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
10880 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74  IdxSelect, sqlit
10890 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
108a0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 67        "SELECT pg
108b0 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  no FROM '%q'.'%q
108c0 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a 20 20  _idx' WHERE ".  
108d0 20 20 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f          "segid=?
108e0 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44   AND term<=? ORD
108f0 45 52 20 42 59 20 74 65 72 6d 20 44 45 53 43 20  ER BY term DESC 
10900 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20  LIMIT 1",.      
10910 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
10920 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
10930 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69  .    ));.  }.  i
10940 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
10950 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  n;.  sqlite3_bin
10960 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c  d_int(p->pIdxSel
10970 65 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53  ect, 1, pSeg->iS
10980 65 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  egid);.  sqlite3
10990 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49  _bind_blob(p->pI
109a0 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65  dxSelect, 2, pTe
109b0 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54  rm, nTerm, SQLIT
109c0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
109d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
109e0 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
109f0 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  xSelect) ){.    
10a00 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65  i64 val = sqlite
10a10 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e  3_column_int(p->
10a20 70 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a  pIdxSelect, 0);.
10a30 20 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28      iPg = (int)(
10a40 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c  val>>1);.    bDl
10a50 69 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30  idx = (val & 0x0
10a60 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72  001);.  }.  p->r
10a70 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
10a80 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  t(p->pIdxSelect)
10a90 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  ;..  if( iPg<pSe
10aa0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
10ab0 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
10ac0 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
10ad0 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
10ae0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
10af0 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
10b00 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
10b10 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
10b20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
10b30 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65  af ){.    fts5Le
10b40 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70  afSeek(p, bGe, p
10b50 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Iter, pTerm, nTe
10b60 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rm);.  }..  if( 
10b70 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10b80 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20   && bGe==0 ){.  
10b90 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
10ba0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
10bb0 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
10bc0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
10bd0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
10be0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
10bf0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
10c00 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
10c10 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
10c20 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
10c30 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78        if( bDlidx
10c40 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
10c50 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
10c60 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10c70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
10c80 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
10c90 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
10ca0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10cb0 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65  rReverse(p, pIte
10cc0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
10cd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  }.  }..  /* Eith
10ce0 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er:.  **.  **   
10cf0 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  1) an error has 
10d00 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a  occurred, or.  *
10d10 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72 61  *   2) the itera
10d20 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
10d30 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20  F, or.  **   3) 
10d40 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
10d50 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
10d60 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d  with term (pTerm
10d70 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a  /nTerm), or.  **
10d80 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49 4e     4) the FTS5IN
10d90 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66  DEX_QUERY_SCAN f
10da0 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64 20  lag was set and 
10db0 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
10dc0 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f  nts.  **      to
10dd0 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
10de0 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74 68   term greater th
10df0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28  an or equal to (
10e00 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20  pTerm/nTerm)..  
10e10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
10e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20  rc!=SQLITE_OK   
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20         /* 1 */. 
10e60 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61    || pIter->pLea
10e70 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  f==0            
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c     /* 2 */.   ||
10eb0 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
10ec0 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
10ed0 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
10ee0 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f  m)==0          /
10ef0 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47  * 3 */.   || (bG
10f00 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43  e && fts5BufferC
10f10 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65  ompareBlob(&pIte
10f20 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  r->term, pTerm, 
10f30 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20  nTerm)>0)  /* 4 
10f40 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  */.  );.}../*.**
10f50 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10f60 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
10f70 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54  point to term pT
10f80 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e  erm/nTerm within
10f90 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
10fa0 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66  y hash table. If
10fb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63   there is no suc
10fc0 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61  h term in the ha
10fd0 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a  sh-table, the .*
10fe0 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65  * iterator is se
10ff0 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
11000 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11010 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
11020 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
11030 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
11040 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
11050 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
11060 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
11070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11080 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
11090 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
110a0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
110b0 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74  erHashInit(.  Ft
110c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
110e0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
110f0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
11100 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
11110 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
11120 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66  ek to */.  int f
11130 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
11140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11150 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
11160 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  XXX flags */.  F
11170 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
11180 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
11190 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
111a0 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  late */.){.  con
111b0 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30  st u8 *pList = 0
111c0 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20  ;.  int nList = 
111d0 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  0;.  const u8 *z
111e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   = 0;.  int n = 
111f0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
11200 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65  >pHash );.  asse
11210 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
11220 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  E_OK );..  if( p
11230 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  Term==0 || (flag
11240 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
11250 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20  ERY_SCAN) ){.   
11260 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
11270 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74  Fts5HashScanInit
11280 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73  (p->pHash, (cons
11290 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e  t char*)pTerm, n
112a0 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Term);.    sqlit
112b0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
112c0 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  try(p->pHash, (c
112d0 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20  onst char**)&z, 
112e0 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
112f0 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69  .    n = (z ? (i
11300 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74  nt)strlen((const
11310 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a   char*)z) : 0);.
11320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
11330 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
11340 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
11350 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  M;.    sqlite3Ft
11360 73 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e 70  s5HashQuery(p->p
11370 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11380 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  r*)pTerm, nTerm,
11390 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
113a0 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b  ;.    z = pTerm;
113b0 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a  .    n = nTerm;.
113c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74    }..  if( pList
113d0 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
113e0 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c   *pLeaf;.    sql
113f0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
11400 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
11410 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20  ->term, n, z);. 
11420 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49     pLeaf = fts5I
11430 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
11440 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20  of(Fts5Data));. 
11450 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
11460 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
11470 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
11480 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e  ist;.    pLeaf->
11490 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  nn = pLeaf->szLe
114a0 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
114b0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
114c0 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  Leaf;.    pIter-
114d0 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
114e0 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 65  ts5GetVarint(pLe
114f0 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49  af->p, (u64*)&pI
11500 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
11510 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
11520 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e  oclist = pLeaf->
11530 6e 6e 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 66  nn+1;..    if( f
11540 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
11550 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20  _QUERY_DESC ){. 
11560 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
11570 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
11580 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
11590 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
115a0 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
115b0 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
115c0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
115d0 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
115e0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
115f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
11600 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
11610 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
11620 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
11630 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
11640 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
11650 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
11660 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
11670 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
11680 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11690 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
116a0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
116b0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
116c0 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
116d0 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
116e0 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
116f0 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
11700 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
11710 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
11720 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
11730 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
11740 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
11750 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11760 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
11770 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
11780 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
11790 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
117a0 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
117b0 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
117c0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
117d0 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
117e0 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
117f0 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
11800 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
11810 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
11820 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
11830 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
11840 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
11850 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
11860 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
11870 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  t(.  Fts5IndexIt
11880 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74  er *pIter, .  Ft
11890 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20  s5SegIter *p1,. 
118a0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
118b0 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  ,.  Fts5CResult 
118c0 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69  *pRes.){.  int i
118d0 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e  1 = p1 - pIter->
118e0 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d  aSeg;.  int i2 =
118f0 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65   p2 - pIter->aSe
11900 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c  g;..  if( p1->pL
11910 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66  eaf || p2->pLeaf
11920 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e   ){.    if( p1->
11930 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
11940 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
11950 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
11960 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
11970 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
11980 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
11990 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20  iFirst==i1 );.  
119a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
119b0 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31  nt nMin = MIN(p1
119c0 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65  ->term.n, p2->te
119d0 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74  rm.n);.      int
119e0 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31   res = memcmp(p1
119f0 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65  ->term.p, p2->te
11a00 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  rm.p, nMin);.   
11a10 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
11a20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e  res = p1->term.n
11a30 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a   - p2->term.n;..
11a40 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
11a50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
11a60 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
11a70 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  q==1 );.        
11a80 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77  assert( p1->iRow
11a90 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id!=p2->iRowid )
11aa0 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
11ab0 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
11ac0 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
11ad0 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
11ae0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
11af0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11b00 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30  pRes->bTermEq==0
11b10 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
11b20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
11b30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11b40 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
11b50 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
11b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11b70 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
11b80 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 );.      }.   
11b90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11ba0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11bb0 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
11bc0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
11bd0 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69  defined when thi
11be0 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63  s module.** is c
11bf0 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74  ompiled. In that
11c00 20 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63   case, this func
11c10 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61  tion is essentia
11c20 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20  lly an assert() 
11c30 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73  .** statement us
11c40 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
11c50 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
11c60 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
11c70 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  rst[] array.** a
11c80 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  re correct..*/.s
11c90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
11ca0 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
11cb0 74 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70  tup(Fts5Index *p
11cc0 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  , Fts5IndexIter 
11cd0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
11ce0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11cf0 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
11d00 65 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49  er *pFirst = &pI
11d10 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
11d20 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
11d30 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  st ];.    int i;
11d40 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ..    assert( (p
11d50 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29  First->pLeaf==0)
11d60 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b  ==pIter->bEof );
11d70 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
11d80 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74  hat pIter->iSwit
11d90 63 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63  chRowid is set c
11da0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
11db0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
11dc0 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
11dd0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
11de0 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
11df0 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73  Seg[i];.      as
11e00 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74  sert( p1==pFirst
11e10 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
11e20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20  p1->pLeaf==0 .  
11e30 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35           || fts5
11e40 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
11e50 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31  First->term, &p1
11e60 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20  ->term) .       
11e70 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69      || p1->iRowi
11e80 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63  d==pIter->iSwitc
11e90 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20  hRowid.         
11ea0 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64    || (p1->iRowid
11eb0 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
11ec0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
11ed0 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ev.      );.    
11ee0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
11ef0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
11f00 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
11f10 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
11f20 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
11f30 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
11f40 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p2 = &pIter->a
11f50 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20  Seg[i+1];.      
11f60 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
11f70 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
11f80 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20  st[(pIter->nSeg 
11f90 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20  + i) / 2];.     
11fa0 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
11fb0 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
11fc0 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
11fd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
11fe0 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e  (i=1; i<(pIter->
11ff0 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29  nSeg / 2); i+=2)
12000 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
12010 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
12020 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
12030 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73  First[i*2].iFirs
12040 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53  t ];.      Fts5S
12050 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49  egIter *p2 = &pI
12060 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
12070 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e  ->aFirst[i*2+1].
12080 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20  iFirst ];.      
12090 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
120a0 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
120b0 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73  st[i];.      fts
120c0 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f  5AssertCompariso
120d0 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70  nResult(pIter, p
120e0 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20  1, p2, pRes);.  
120f0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
12100 23 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73  # define fts5Ass
12110 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
12120 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f  p(x,y).#endif../
12130 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70  *.** Do the comp
12140 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79  arison necessary
12150 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74   to populate pIt
12160 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d  er->aFirst[iOut]
12170 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
12180 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
12190 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
121a0 69 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  it is the index 
121b0 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69  of an entry.** i
121c0 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65  n the pIter->aSe
121d0 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69  g[] array that i
121e0 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46  s (a) not at EOF
121f0 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69  , and (b) pointi
12200 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74  ng.** to a key t
12210 68 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61  hat is a duplica
12220 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68  te of another, h
12230 69 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20  igher priority, 
12240 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72  .** segment-iter
12250 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67  ator in the pSeg
12260 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aSeg[] array..
12270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
12280 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
12290 70 61 72 65 28 46 74 73 35 49 6e 64 65 78 49 74  pare(Fts5IndexIt
122a0 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69  er *pIter, int i
122b0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20  Out){.  int i1; 
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
122e0 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74   of left-hand Ft
122f0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
12300 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20  nt i2;          
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12320 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
12330 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
12340 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b  r */.  int iRes;
12350 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
12360 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
12370 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
12380 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
12390 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
123a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
123b0 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46   /* Right-hand F
123c0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
123d0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
123e0 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
123f0 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73  st[iOut];..  ass
12400 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d  ert( iOut<pIter-
12410 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20  >nSeg && iOut>0 
12420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
12430 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70  er->bRev==0 || p
12440 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b  Iter->bRev==1 );
12450 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70  ..  if( iOut>=(p
12460 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b  Iter->nSeg/2) ){
12470 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20  .    i1 = (iOut 
12480 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29  - pIter->nSeg/2)
12490 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69   * 2;.    i2 = i
124a0 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 + 1;.  }else{.
124b0 20 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e      i1 = pIter->
124c0 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69  aFirst[iOut*2].i
124d0 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20  First;.    i2 = 
124e0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
124f0 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a  ut*2+1].iFirst;.
12500 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65    }.  p1 = &pIte
12510 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70  r->aSeg[i1];.  p
12520 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
12530 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62  [i2];..  pRes->b
12540 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66  TermEq = 0;.  if
12550 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
12560 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {           /* I
12570 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a  f p1 is at EOF *
12580 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b  /.    iRes = i2;
12590 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d  .  }else if( p2-
125a0 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
125b0 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20   /* If p2 is at 
125c0 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
125d0 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = i1;.  }else{. 
125e0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73     int res = fts
125f0 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26  5BufferCompare(&
12600 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74  p1->term, &p2->t
12610 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65  erm);.    if( re
12620 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  s==0 ){.      as
12630 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20  sert( i2>i1 );. 
12640 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21       assert( i2!
12650 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73  =0 );.      pRes
12660 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20  ->bTermEq = 1;. 
12670 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f       if( p1->iRo
12680 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20  wid==p2->iRowid 
12690 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62  ){.        p1->b
126a0 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a  Del = p2->bDel;.
126b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
126c0 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
126d0 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
126e0 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
126f0 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
12700 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d  ? -1 : +1;.    }
12710 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73  .    assert( res
12720 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  !=0 );.    if( r
12730 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52  es<0 ){.      iR
12740 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c  es = i1;.    }el
12750 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d  se{.      iRes =
12760 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i2;.    }.  }..
12770 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
12780 20 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20   iRes;.  return 
12790 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
127a0 20 74 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f   the seg-iter so
127b0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
127c0 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
127d0 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66  id on page iLeaf
127e0 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61  Pgno..** It is a
127f0 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20  n error if leaf 
12800 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e  iLeafPgno does n
12810 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
12820 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a  ains no rowids..
12830 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12840 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
12850 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
12860 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12870 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12880 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
12890 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
128a0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
128b0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
128c0 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
128d0 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20  t iLeafPgno.){. 
128e0 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67   assert( iLeafPg
128f0 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
12900 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c  gno );..  if( iL
12910 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70  eafPgno>pIter->p
12920 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
12930 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
12940 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  5_CORRUPT;.  }el
12950 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61  se{.    fts5Data
12960 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
12970 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70  NextLeaf);.    p
12980 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
12990 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  = 0;.    pIter->
129a0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
129b0 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73  fPgno-1;.    fts
129c0 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
129d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
129e0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
129f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65  QLITE_OK || pIte
12a00 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c  r->iLeafPgno==iL
12a10 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20  eafPgno );..    
12a20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
12a40 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38  t iOff;.      u8
12a50 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
12a60 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74  af->p;.      int
12a70 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
12a80 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20  f->szLeaf;..    
12a90 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61    iOff = fts5Lea
12aa0 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
12ab0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
12ac0 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c      if( iOff<4 |
12ad0 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20  | iOff>=n ){.   
12ae0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
12af0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
12b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12b10 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
12b20 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
12b30 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
12b40 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70  owid);.        p
12b50 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
12b60 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
12b70 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
12b80 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
12b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12ba0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61   }.}../*.** Adva
12bb0 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
12bc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
12bd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75  econd argument u
12be0 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72  ntil it is at or
12bf0 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20   .** past rowid 
12c00 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73  iFrom. Regardles
12c10 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
12c20 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65  f iFrom, the ite
12c30 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61  rator is.** alwa
12c40 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c  ys advanced at l
12c50 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74  east once..*/.st
12c60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
12c70 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  gIterNextFrom(. 
12c80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
12cb0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
12cc0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ce0 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
12cf0 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61  nce */.  i64 iMa
12d00 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
12d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
12d20 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20  nce iterator at 
12d30 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a  least this far *
12d40 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20  /.){.  int bRev 
12d50 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
12d60 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
12d70 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
12d80 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
12d90 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
12da0 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  ;.  int iLeafPgn
12db0 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  o = pIter->iLeaf
12dc0 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76  Pgno;.  int bMov
12dd0 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
12de0 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
12df0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
12e00 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72  ETERM );.  asser
12e10 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t( pIter->pDlidx
12e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
12e30 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  ter->pLeaf );.. 
12e40 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
12e50 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35      while( !fts5
12e60 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
12e70 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63  pDlidx) && iMatc
12e80 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  h>fts5DlidxIterR
12e90 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a  owid(pDlidx) ){.
12ea0 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20        iLeafPgno 
12eb0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
12ec0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
12ed0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
12ee0 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b  Next(p, pDlidx);
12ef0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
12f00 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e  t_nc( iLeafPgno>
12f10 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
12f20 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20  o || p->rc );.  
12f30 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
12f40 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12f50 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
12f60 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c  gIterGotoPage(p,
12f70 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e   pIter, iLeafPgn
12f80 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  o);.      bMove 
12f90 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
12fa0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
12fb0 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
12fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
12fd0 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d  t( iMatch<pIter-
12fe0 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77  >iRowid );.    w
12ff0 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
13000 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
13010 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73  x) && iMatch<fts
13020 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
13030 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
13040 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
13050 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  ev(p, pDlidx);. 
13060 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67     }.    iLeafPg
13070 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
13080 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
13090 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
130a0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
130b0 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61   pDlidx) || iLea
130c0 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c  fPgno<=pIter->iL
130d0 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20  eafPgno );..    
130e0 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49  if( iLeafPgno<pI
130f0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
13100 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
13110 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
13120 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74  Pgno+1;.      ft
13130 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
13140 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
13150 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
13160 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
13170 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f   do{.    if( bMo
13180 76 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72  ve ) fts5SegIter
13190 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
131a0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
131b0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ->pLeaf==0 ) bre
131c0 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
131d0 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  ==0 && pIter->iR
131e0 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
131f0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
13200 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev!=0 && pIter->
13210 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
13220 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76   break;.    bMov
13230 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28  e = 1;.  }while(
13240 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13250 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  K );.}.../*.** F
13260 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ree the iterator
13270 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
13280 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
13290 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
132a0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
132b0 74 65 72 46 72 65 65 28 46 74 73 35 49 6e 64 65  terFree(Fts5Inde
132c0 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49  x *p, Fts5IndexI
132d0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
132e0 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
132f0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
13300 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
13310 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
13320 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
13330 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
13340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
13350 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
13360 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
13370 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
13380 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73  Free(&pIter->pos
13390 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
133a0 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
133b0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
133c0 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
133d0 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35  Advanced(.  Fts5
133e0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
133f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13400 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
13410 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
13420 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
13430 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
13440 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
13450 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
13460 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
13470 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
134a0 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
134b0 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  dvanced */.  int
134c0 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20   iMinset        
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
134e0 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e  Minimum entry in
134f0 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74   aFirst[] to set
13500 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
13510 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
13520 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
13530 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20  ; i>=iMinset && 
13540 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13550 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e  ; i=i/2){.    in
13560 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28  t iEq;.    if( (
13570 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  iEq = fts5MultiI
13580 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74  terDoCompare(pIt
13590 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20  er, i)) ){.     
135a0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
135b0 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67  (p, &pIter->aSeg
135c0 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20  [iEq], 0);.     
135d0 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67   i = pIter->nSeg
135e0 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20   + iEq;.    }.  
135f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69  }.}../*.** Sub-i
13600 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64  terator iChanged
13610 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74   of iterator pIt
13620 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  er has just been
13630 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74   advanced. It st
13640 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ill.** points to
13650 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74   the same term t
13660 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64  hough - just a d
13670 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20  ifferent rowid. 
13680 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
13690 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64   attempts to upd
136a0 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
136b0 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
136c0 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e  First[] accordin
136d0 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  gly..** If it do
136e0 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c  es so successful
136f0 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ly, 0 is returne
13700 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a  d. Otherwise 1..
13710 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72  **.** If non-zer
13720 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  o is returned, t
13730 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
13740 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49   call fts5MultiI
13750 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a  terAdvanced().**
13760 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72   on the iterator
13770 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66   instead. That f
13780 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
13790 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e   same as this on
137a0 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  e, except.** tha
137b0 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20  t it deals with 
137c0 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
137d0 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a   cases as well..
137e0 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */ .static int f
137f0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
13800 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
13810 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
13820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13830 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
13840 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
13850 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
13860 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
13870 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
13880 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
13890 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
138a0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20   int iChanged   
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
138d0 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
138e0 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20  dvanced */.){.  
138f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65  Fts5SegIter *pNe
13900 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  w = &pIter->aSeg
13910 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69  [iChanged];..  i
13920 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d  f( pNew->iRowid=
13930 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  =pIter->iSwitchR
13940 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77  owid.   || (pNew
13950 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e  ->iRowid<pIter->
13960 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70  iSwitchRowid)==p
13970 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a  Iter->bRev.  ){.
13980 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46      int i;.    F
13990 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68  ts5SegIter *pOth
139a0 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
139b0 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30  g[iChanged ^ 0x0
139c0 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  001];.    pIter-
139d0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
139e0 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d  pIter->bRev ? SM
139f0 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c  ALLEST_INT64 : L
13a00 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
13a10 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
13a20 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
13a30 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  ; 1; i=i/2){.   
13a40 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a     Fts5CResult *
13a50 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
13a60 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20  First[i];..     
13a70 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
13a80 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73  Leaf );.      as
13a90 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
13aa0 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72  mEq==0 || pOther
13ab0 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20  ->pLeaf );..    
13ac0 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72    if( pRes->bTer
13ad0 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  mEq ){.        i
13ae0 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d  f( pNew->iRowid=
13af0 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20  =pOther->iRowid 
13b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
13b10 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
13b20 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72  else if( (pOther
13b30 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69  ->iRowid>pNew->i
13b40 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
13b50 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
13b60 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
13b70 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69  owid = pOther->i
13b80 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
13b90 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a   pNew = pOther;.
13ba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13bb0 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  ( (pOther->iRowi
13bc0 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  d>pIter->iSwitch
13bd0 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
13be0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
13bf0 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
13c00 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69  owid = pOther->i
13c10 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
13c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13c30 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70  Res->iFirst = (p
13c40 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65  New - pIter->aSe
13c50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  g);.      if( i=
13c60 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =1 ) break;..   
13c70 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74     pOther = &pIt
13c80 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13c90 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30  >aFirst[i ^ 0x00
13ca0 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  01].iFirst ];.  
13cb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
13cc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
13cd0 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f  t the pIter->bEo
13ce0 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64  f variable based
13cf0 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66   on the state of
13d00 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f   the sub-iterato
13d10 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
13d20 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
13d30 53 65 74 45 6f 66 28 46 74 73 35 49 6e 64 65 78  SetEof(Fts5Index
13d40 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13d50 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
13d60 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
13d70 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
13d80 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70  1].iFirst ];.  p
13d90 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65  Iter->bEof = pSe
13da0 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70  g->pLeaf==0;.  p
13db0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13dc0 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
13dd0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
13de0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
13df0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
13e00 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
13e10 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
13e20 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
13e30 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
13e40 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
13e50 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
13e60 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
13e70 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
13e80 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
13e90 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
13ea0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
13eb0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
13ec0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13ed0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
13ee0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
13ef0 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65   .  Fts5IndexIte
13f00 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
13f10 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
13f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13f30 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
13f40 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
13f50 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
13f80 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
13f90 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
13fa0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13fb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
13fc0 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
13fd0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
13fe0 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
13ff0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14000 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
14010 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
14020 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14030 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
14040 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
14050 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
14060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
14070 20 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72        if( bUseFr
14080 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
14090 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
140a0 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
140b0 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
140c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
140d0 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
140e0 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  terNext(p, pSeg,
140f0 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
14100 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
14110 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c  pSeg->pLeaf==0 |
14120 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20  | bNewTerm .    
14130 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
14140 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
14150 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
14160 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
14170 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
14180 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
14190 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
141a0 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
141b0 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72  IterSetEof(pIter
141c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
141d0 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
141e0 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
141f0 65 72 29 3b 0a 0a 20 20 20 20 20 20 62 55 73 65  er);..      bUse
14200 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77  From = 0;.    }w
14210 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b  hile( pIter->bSk
14220 69 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d  ipEmpty && fts5M
14230 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
14240 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d  p, pIter) );.  }
14250 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
14260 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
14270 74 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  t2(.  Fts5Index 
14280 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78  *p, .  Fts5Index
14290 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69  Iter *pIter,.  i
142a0 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20  nt *pbNewTerm   
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142c0 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a  * OUT: True if *
142d0 6d 69 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65  might* be new te
142e0 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rm */.){.  if( p
142f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14300 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
14310 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
14320 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
14330 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74  iFirst;.      Ft
14340 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
14350 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
14360 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e  First];.      in
14370 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a  t bNewTerm = 0;.
14380 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
14390 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
143a0 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
143b0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
143c0 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d  f==0 || bNewTerm
143d0 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35   .       || fts5
143e0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
143f0 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 2c 20  Rowid(p, pIter, 
14400 69 46 69 72 73 74 29 0a 20 20 20 20 20 20 29 7b  iFirst).      ){
14410 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
14420 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70  tiIterAdvanced(p
14430 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c  , pIter, iFirst,
14440 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   1);.        fts
14450 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
14460 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  (pIter);.       
14470 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
14480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14490 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d        *pbNewTerm
144a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
144b0 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75      fts5AssertMu
144c0 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20  ltiIterSetup(p, 
144d0 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68  pIter);..    }wh
144e0 69 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b 69  ile( pIter->bSki
144f0 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
14500 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
14510 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a  , pIter) );.  }.
14520 7d 0a 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49  }...static Fts5I
14530 6e 64 65 78 49 74 65 72 20 2a 66 74 73 35 4d 75  ndexIter *fts5Mu
14540 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20  ltiIterAlloc(.  
14550 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
14580 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
14590 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a  n */.  int nSeg.
145a0 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  ){.  Fts5IndexIt
145b0 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  er *pNew;.  int 
145c0 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
145d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
145e0 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e  ower of two >= n
145f0 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53  Seg */..  for(nS
14600 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65  lot=2; nSlot<nSe
14610 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32  g; nSlot=nSlot*2
14620 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  );.  pNew = fts5
14630 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
14640 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49      sizeof(Fts5I
14650 6e 64 65 78 49 74 65 72 29 20 2b 20 20 20 20 20  ndexIter) +     
14660 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
14670 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14680 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28  Fts5SegIter) * (
14690 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20  nSlot-1) +   /* 
146a0 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
146b0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
146c0 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f  5CResult) * nSlo
146d0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65  t         /* pNe
146e0 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
146f0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   );.  if( pNew )
14700 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67  {.    pNew->nSeg
14710 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e   = nSlot;.    pN
14720 65 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74  ew->aFirst = (Ft
14730 73 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77  s5CResult*)&pNew
14740 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20  ->aSeg[nSlot];. 
14750 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20     pNew->pIndex 
14760 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = p;.  }.  retur
14770 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
14780 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
14790 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 6f 62  Fts5IndexIter ob
147a0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
147b0 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  new object will 
147c0 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
147d0 74 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20  te through data 
147e0 69 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74  in structure pSt
147f0 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76  ruct..** If iLev
14800 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20  el is -ve, then 
14810 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20  all data in all 
14820 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67  segments is merg
14830 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65  ed. Or, if iLeve
14840 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20  l.** is zero or 
14850 67 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72  greater, data fr
14860 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65  om the first nSe
14870 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f  gment segments o
14880 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a  n level iLevel.*
14890 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a  * is merged..**.
148a0 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
148b0 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73  initially points
148c0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65   to the first te
148d0 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69  rm/rowid entry i
148e0 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  n the .** iterat
148f0 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
14900 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
14910 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35  iIterNew(.  Fts5
14920 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14940 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
14950 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
14960 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
14970 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20   *pStruct,      
14980 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
14990 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65  of specific inde
149a0 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  x */.  int bSkip
149b0 45 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20 20  Empty,          
149c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
149d0 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d  o ignore delete-
149e0 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  keys */.  int fl
149f0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
14a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14a10 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58  5INDEX_QUERY_XXX
14a20 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
14a30 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
14a40 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
14a50 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28  erm to seek to (
14a60 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20  or NULL/0) */.  
14a70 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72  /* Level to iter
14aa0 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29  ate (-1 for all)
14ab0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
14ac0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
14ad0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14ae0 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
14af0 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29  erge (iLevel>=0)
14b00 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
14b10 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
14b20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
14b30 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
14b40 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  nSeg = 0;       
14b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14b60 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
14b70 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f  -iters in use */
14b80 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30  .  int iIter = 0
14b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14ba0 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69     /* */.  int i
14bb0 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
14bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
14bd0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
14be0 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
14bf0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
14c00 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  uf = {0,0,0};   
14c10 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
14c20 65 64 20 62 79 20 66 74 73 35 53 65 67 49 74 65  ed by fts5SegIte
14c30 72 53 65 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20  rSeekInit() */. 
14c40 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
14c50 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73  vel *pLvl;.  Fts
14c60 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77  5IndexIter *pNew
14c70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ;..  assert( (pT
14c80 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d  erm==0 && nTerm=
14c90 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20  =0) || iLevel<0 
14ca0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14cb0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
14cc0 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74  new multi-seg-it
14cd0 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28  erator. */.  if(
14ce0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14cf0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
14d00 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  vel<0 ){.      a
14d10 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
14d20 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
14d30 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
14d40 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
14d50 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53  .      nSeg = pS
14d60 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
14d70 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28  .      nSeg += (
14d80 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30  p->pHash ? 1 : 0
14d90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14da0 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70      nSeg = MIN(p
14db0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
14dc0 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65  Level].nSeg, nSe
14dd0 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  gment);.    }.  
14de0 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65  }.  *ppOut = pNe
14df0 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
14e00 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b  rAlloc(p, nSeg);
14e10 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
14e20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
14e30 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
14e40 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
14e50 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
14e60 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
14e70 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a 20 20  = bSkipEmpty;.  
14e80 70 4e 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20  pNew->pStruct = 
14e90 70 53 74 72 75 63 74 3b 0a 20 20 66 74 73 35 53  pStruct;.  fts5S
14ea0 74 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72  tructureRef(pStr
14eb0 75 63 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  uct);..  /* Init
14ec0 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
14ed0 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
14ee0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
14ef0 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  */.  if( iLevel<
14f00 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
14f10 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e  uctureLevel *pEn
14f20 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  d = &pStruct->aL
14f30 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c  evel[pStruct->nL
14f40 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70  evel];.    if( p
14f50 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->pHash ){.     
14f60 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e   /* Add a segmen
14f70 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74  t iterator for t
14f80 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
14f90 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20  nts of the hash 
14fa0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
14fb0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
14fc0 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
14fd0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
14fe0 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
14ff0 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e  Init(p, pTerm, n
15000 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74  Term, flags, pIt
15010 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
15020 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74  or(pLvl=&pStruct
15030 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76  ->aLevel[0]; pLv
15040 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b  l<pEnd; pLvl++){
15050 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
15060 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53  pLvl->nSeg-1; iS
15070 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a  eg>=0; iSeg--){.
15080 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
15090 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
150a0 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67  eg = &pLvl->aSeg
150b0 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
150c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
150d0 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
150e0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
150f0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
15100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
15110 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
15120 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
15130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15140 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
15150 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 26 62  erSeekInit(p, &b
15160 75 66 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  uf, pTerm, nTerm
15170 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70  , flags, pSeg, p
15180 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
15190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
151a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c   }else{.    pLvl
151b0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
151c0 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20  vel[iLevel];.   
151d0 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31   for(iSeg=nSeg-1
151e0 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
151f0 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  -){.      fts5Se
15200 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c  gIterInit(p, &pL
15210 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
15220 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
15230 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r++]);.    }.  }
15240 0a 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72  .  assert( iIter
15250 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20  ==nSeg );..  /* 
15260 49 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73  If the above was
15270 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
15280 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72  h component iter
15290 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73  ators now points
152a0 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69   .  ** to the fi
152b0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73  rst entry in its
152c0 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69   segment. In thi
152d0 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a  s case initializ
152e0 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72  e the .  ** aFir
152f0 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20  st[] array. Or, 
15300 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
15310 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74  occurred, free t
15320 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a  he iterator.  **
15330 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20   object and set 
15340 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
15350 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f  ble to NULL.  */
15360 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
15370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
15380 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e  or(iIter=pNew->n
15390 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20  Seg-1; iIter>0; 
153a0 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20  iIter--){.      
153b0 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69  int iEq;.      i
153c0 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
153d0 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
153e0 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29  (pNew, iIter)) )
153f0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
15400 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e  gIterNext(p, &pN
15410 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30  ew->aSeg[iEq], 0
15420 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
15430 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
15440 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69  (p, pNew, iEq, i
15450 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
15460 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c     }.    fts5Mul
15470 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65  tiIterSetEof(pNe
15480 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65  w);.    fts5Asse
15490 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
154a0 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  (p, pNew);..    
154b0 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45  if( pNew->bSkipE
154c0 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74  mpty && fts5Mult
154d0 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
154e0 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66  pNew) ){.      f
154f0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
15500 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b  (p, pNew, 0, 0);
15510 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15520 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15530 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a  rFree(p, pNew);.
15540 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a      *ppOut = 0;.
15550 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
15560 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f  Free(&buf);.}../
15570 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46  *.** Create an F
15580 74 73 35 49 6e 64 65 78 49 74 65 72 20 74 68 61  ts5IndexIter tha
15590 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
155a0 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70  gh the doclist p
155b0 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68  rovided.** as th
155c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
155d0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
155e0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
155f0 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ew2(.  Fts5Index
15600 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15610 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
15620 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
15630 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
15640 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20  s5Data *pData,  
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15660 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72   Doclist to iter
15670 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
15680 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73   /* True for des
156b0 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
156c0 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  der */.  Fts5Ind
156d0 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  exIter **ppOut  
156e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
156f0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
15700 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e  ts5IndexIter *pN
15710 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73  ew;.  pNew = fts
15720 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
15730 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65  p, 2);.  if( pNe
15740 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  w ){.    Fts5Seg
15750 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
15760 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20  New->aSeg[1];.. 
15770 20 20 20 70 4e 65 77 2d 3e 62 46 69 6c 74 65 72     pNew->bFilter
15780 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65  ed = 1;.    pIte
15790 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53 35 5f  r->flags = FTS5_
157a0 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
157b0 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
157c0 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20 20 20  szLeaf>0 ){.    
157d0 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
157e0 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 70 49   pData;.      pI
157f0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
15800 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
15810 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a  (pData->p, (u64*
15820 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
15830 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
15840 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
15850 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20  Data->nn;.      
15860 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  pNew->aFirst[1].
15870 69 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  iFirst = 1;.    
15880 20 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20    if( bDesc ){. 
15890 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 52 65         pNew->bRe
158a0 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  v = 1;.        p
158b0 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
158c0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
158d0 52 53 45 3b 0a 20 20 20 20 20 20 20 20 66 74 73  RSE;.        fts
158e0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
158f0 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
15900 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15910 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
15920 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
15930 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
15940 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a       pData = 0;.
15950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15960 20 70 4e 65 77 2d 3e 62 45 6f 66 20 3d 20 31 3b   pNew->bEof = 1;
15970 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 4f  .    }..    *ppO
15980 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a  ut = pNew;.  }..
15990 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
159a0 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pData);.}../*.
159b0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
159c0 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
159d0 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61  s at EOF or if a
159e0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
159f0 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20  rred. .** False 
15a00 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
15a10 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
15a20 74 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  tiIterEof(Fts5In
15a30 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65  dex *p, Fts5Inde
15a40 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
15a50 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a   assert( p->rc .
15a60 20 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d        || (pIter-
15a70 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15a80 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
15a90 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65  .pLeaf==0)==pIte
15aa0 72 2d 3e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20  r->bEof .  );.  
15ab0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
15ac0 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d   pIter->bEof);.}
15ad0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15ae0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
15af0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69  entry that the i
15b00 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
15b10 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20  y points.** to. 
15b20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
15b30 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68  points to EOF wh
15b40 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
15b50 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a   is called the.*
15b60 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  * results are un
15b70 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
15b80 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69  ic i64 fts5Multi
15b90 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e  IterRowid(Fts5In
15ba0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
15bb0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
15bc0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15bd0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15be0 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74  ].pLeaf );.  ret
15bf0 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  urn pIter->aSeg[
15c00 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15c10 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69  ].iFirst ].iRowi
15c20 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
15c30 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
15c40 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
15c50 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  at or following 
15c60 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  iMatch..*/.stati
15c70 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15c80 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
15c90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
15ca0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
15cb0 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d  pIter, .  i64 iM
15cc0 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28  atch.){.  while(
15cd0 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52   1 ){.    i64 iR
15ce0 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75  owid;.    fts5Mu
15cf0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
15d00 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29  Iter, 1, iMatch)
15d10 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75  ;.    if( fts5Mu
15d20 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
15d30 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ter) ) break;.  
15d40 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d    iRowid = fts5M
15d50 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
15d60 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ter);.    if( pI
15d70 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20  ter->bRev==0 && 
15d80 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29  iRowid>=iMatch )
15d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
15da0 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26  pIter->bRev!=0 &
15db0 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68  & iRowid<=iMatch
15dc0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a   ) break;.  }.}.
15dd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
15de0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
15df0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
15e00 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74  he term associat
15e10 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  ed with the .** 
15e20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69  entry that the i
15e30 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
15e40 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  y points to..*/.
15e50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
15e60 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65  *fts5MultiIterTe
15e70 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  rm(Fts5IndexIter
15e80 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e   *pIter, int *pn
15e90 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
15ea0 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   *p = &pIter->aS
15eb0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
15ec0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
15ed0 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e   *pn = p->term.n
15ee0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65  ;.  return p->te
15ef0 72 6d 2e 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rm.p;.}..static 
15f00 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74  void fts5ChunkIt
15f10 65 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64  erate(.  Fts5Ind
15f20 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
15f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15f40 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
15f50 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f70 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73   Poslist of this
15f80 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76   iterator */.  v
15f90 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fb0 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  * Context pointe
15fc0 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c  r for xChunk cal
15fd0 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20  lback */.  void 
15fe0 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e  (*xChunk)(Fts5In
15ff0 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e  dex*, void*, con
16000 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a  st u8*, int).){.
16010 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65    int nRem = pSe
16020 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  g->nPos;        
16030 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
16040 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f  ytes still to co
16050 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  me */.  Fts5Data
16060 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75   *pData = 0;.  u
16070 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65  8 *pChunk = &pSe
16080 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67  g->pLeaf->p[pSeg
16090 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
160a0 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d    int nChunk = M
160b0 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70  IN(nRem, pSeg->p
160c0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70  Leaf->szLeaf - p
160d0 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
160e0 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  );.  int pgno = 
160f0 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  pSeg->iLeafPgno;
16100 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20  .  int pgnoSave 
16110 3d 20 30 3b 0a 0a 20 20 69 66 28 20 28 70 53 65  = 0;..  if( (pSe
16120 67 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  g->flags & FTS5_
16130 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
16140 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53  ==0 ){.    pgnoS
16150 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20  ave = pgno+1;.  
16160 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  }..  while( 1 ){
16170 0a 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70  .    xChunk(p, p
16180 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  Ctx, pChunk, nCh
16190 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d  unk);.    nRem -
161a0 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74  = nChunk;.    ft
161b0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
161c0 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  ata);.    if( nR
161d0 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  em<=0 ){.      b
161e0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
161f0 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20  .      pgno++;. 
16200 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73       pData = fts
16210 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
16220 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
16230 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
16240 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  id, pgno));.    
16250 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29    if( pData==0 )
16260 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43   break;.      pC
16270 68 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70  hunk = &pData->p
16280 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e  [4];.      nChun
16290 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44  k = MIN(nRem, pD
162a0 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29  ata->szLeaf - 4)
162b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  ;.      if( pgno
162c0 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20  ==pgnoSave ){.  
162d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
162e0 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  eg->pNextLeaf==0
162f0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67   );.        pSeg
16300 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44  ->pNextLeaf = pD
16310 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61  ata;.        pDa
16320 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ta = 0;.      }.
16330 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f      }.  }.}..../
16340 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
16350 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66  new segment-id f
16360 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
16370 20 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65   pStruct. The ne
16380 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20  w segment.** id 
16390 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
163a0 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c  1 and 65335 incl
163b0 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20  usive, and must 
163c0 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a  not be used by .
163d0 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79  ** any currently
163e0 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e   existing segmen
163f0 74 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67  t. If a free seg
16400 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62  ment id cannot b
16410 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
16420 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72  TE_FULL is retur
16430 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ned..**.** If an
16440 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
16450 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
16460 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
16470 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20  no-op. 0 is .** 
16480 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73  returned in this
16490 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
164a0 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74   int fts5Allocat
164b0 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78  eSegid(Fts5Index
164c0 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
164d0 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
164e0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a  int iSegid = 0;.
164f0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16510 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  f( pStruct->nSeg
16520 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53  ment>=FTS5_MAX_S
16530 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  EGMENT ){.      
16540 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46  p->rc = SQLITE_F
16550 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
16560 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 53 65        while( iSe
16570 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  gid==0 ){.      
16580 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
16590 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
165a0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
165b0 65 6f 66 28 75 33 32 29 2c 20 28 76 6f 69 64 2a  eof(u32), (void*
165c0 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20  )&iSegid);.     
165d0 20 20 20 69 53 65 67 69 64 20 3d 20 69 53 65 67     iSegid = iSeg
165e0 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54 53 35  id & ((1 << FTS5
165f0 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a  _DATA_ID_B)-1);.
16600 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c          for(iLvl
16610 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
16620 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
16630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
16640 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
16650 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
16660 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
16670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
16680 66 28 20 69 53 65 67 69 64 3d 3d 70 53 74 72 75  f( iSegid==pStru
16690 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
166a0 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  .aSeg[iSeg].iSeg
166b0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
166c0 20 20 20 20 69 53 65 67 69 64 20 3d 20 30 3b 0a      iSegid = 0;.
166d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
166e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
166f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16700 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
16710 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iSegid;.}../*.**
16720 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74   Discard all dat
16730 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  a currently cach
16740 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  ed in the hash-t
16750 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
16760 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44   void fts5IndexD
16770 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35 49  iscardData(Fts5I
16780 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65  ndex *p){.  asse
16790 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20  rt( p->pHash || 
167a0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
167b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
167c0 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69  Hash ){.    sqli
167d0 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
167e0 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
167f0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
16800 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
16810 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
16820 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c  e of the prefix,
16830 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20   in bytes, that 
16840 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65  buffer (nNew/pNe
16850 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77 69 74  w) shares.** wit
16860 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70  h buffer (nOld/p
16870 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Old)..*/.static 
16880 69 6e 74 20 66 74 73 35 50 72 65 66 69 78 43 6f  int fts5PrefixCo
16890 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f  mpress(.  int nO
168a0 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f  ld, const u8 *pO
168b0 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20  ld,.  int nNew, 
168c0 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a 29  const u8 *pNew.)
168d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
168e0 65 72 74 28 20 66 74 73 35 42 6c 6f 62 43 6f 6d  ert( fts5BlobCom
168f0 70 61 72 65 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c  pare(pOld, nOld,
16900 20 70 4e 65 77 2c 20 6e 4e 65 77 29 3c 30 20 29   pNew, nNew)<0 )
16910 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
16920 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
16930 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77  f( pOld[i]!=pNew
16940 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  [i] ) break;.  }
16950 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
16960 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16970 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28  WriteDlidxClear(
16980 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
16990 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
169a0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
169b0 74 20 62 46 6c 75 73 68 20 20 20 20 20 20 20 20  t bFlush        
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169d0 20 49 66 20 74 72 75 65 2c 20 77 72 69 74 65 20   If true, write 
169e0 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f  dlidx to disk */
169f0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  .){.  int i;.  a
16a00 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30  ssert( bFlush==0
16a10 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44   || (pWriter->nD
16a20 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65  lidx>0 && pWrite
16a30 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
16a40 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69  .n>0) );.  for(i
16a50 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e  =0; i<pWriter->n
16a60 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Dlidx; i++){.   
16a70 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
16a80 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
16a90 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
16aa0 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
16ab0 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b  buf.n==0 ) break
16ac0 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73 68  ;.    if( bFlush
16ad0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16ae0 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d  ( pDlidx->pgno!=
16af0 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  0 );.      fts5D
16b00 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20  ataWrite(p, .   
16b10 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
16b20 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  X_ROWID(pWriter-
16b30 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69  >iSegid, i, pDli
16b40 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20  dx->pgno),.     
16b50 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66       pDlidx->buf
16b60 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  .p, pDlidx->buf.
16b70 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  n.      );.    }
16b80 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
16b90 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69  BufferZero(&pDli
16ba0 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44  dx->buf);.    pD
16bb0 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
16bc0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
16bd0 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72 69  ** Grow the pWri
16be0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72  ter->aDlidx[] ar
16bf0 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20  ray to at least 
16c00 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e  nLvl elements in
16c10 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65   size..** Any ne
16c20 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73  w array elements
16c30 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f   are zeroed befo
16c40 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
16c50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
16c60 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a  WriteDlidxGrow(.
16c70 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
16c80 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
16c90 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
16ca0 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d  nLvl.){.  if( p-
16cb0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
16cc0 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d  & nLvl>=pWriter-
16cd0 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46  >nDlidx ){.    F
16ce0 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
16cf0 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c  aDlidx = (Fts5Dl
16d00 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74  idxWriter*)sqlit
16d10 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
16d20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c      pWriter->aDl
16d30 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  idx, sizeof(Fts5
16d40 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e  DlidxWriter) * n
16d50 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Lvl.    );.    i
16d60 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a  f( aDlidx==0 ){.
16d70 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
16d80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
16da0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
16db0 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29  Fts5DlidxWriter)
16dc0 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74   * (nLvl - pWrit
16dd0 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20  er->nDlidx);.   
16de0 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64     memset(&aDlid
16df0 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  x[pWriter->nDlid
16e00 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  x], 0, nByte);. 
16e10 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44       pWriter->aD
16e20 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20  lidx = aDlidx;. 
16e30 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44       pWriter->nD
16e40 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20  lidx = nLvl;.   
16e50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16e60 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
16e70 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  If the current d
16e80 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63  oclist-index acc
16e90 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72  umulating in pWr
16ea0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69  iter->aDlidx[] i
16eb0 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  s large.** enoug
16ec0 68 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64  h, flush it to d
16ed0 69 73 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31  isk and return 1
16ee0 2e 20 4f 74 68 65 72 77 69 73 65 20 64 69 73 63  . Otherwise disc
16ef0 61 72 64 20 69 74 20 61 6e 64 20 72 65 74 75 72  ard it and retur
16f00 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  n.** zero..*/.st
16f10 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69  atic int fts5Wri
16f20 74 65 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73  teFlushDlidx(Fts
16f30 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
16f40 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
16f50 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20  r){.  int bFlag 
16f60 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  = 0;..  /* If th
16f70 65 72 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49  ere were FTS5_MI
16f80 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20  N_DLIDX_SIZE or 
16f90 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20  more empty leaf 
16fa0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20  pages written.  
16fb0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
16fc0 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74  se, also write t
16fd0 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
16fe0 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20   to disk.  */.  
16ff0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  if( pWriter->aDl
17000 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26  idx[0].buf.n>0 &
17010 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  & pWriter->nEmpt
17020 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44  y>=FTS5_MIN_DLID
17030 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46  X_SIZE ){.    bF
17040 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  lag = 1;.  }.  f
17050 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65  ts5WriteDlidxCle
17060 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62  ar(p, pWriter, b
17070 46 6c 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72  Flag);.  pWriter
17080 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  ->nEmpty = 0;.  
17090 72 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a  return bFlag;.}.
170a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
170b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
170c0 68 65 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69  henever processi
170d0 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73  ng of the doclis
170e0 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61  t for the .** la
170f0 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20  st term on leaf 
17100 70 61 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69  page (pWriter->i
17110 42 74 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c  BtPage) is compl
17120 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  eted. .**.** The
17130 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
17140 6f 72 20 74 68 61 74 20 74 65 72 6d 20 69 73 20  or that term is 
17150 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
17160 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69   in-memory withi
17170 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67  n the.** Fts5Seg
17180 57 72 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20  Writer.aDlidx[] 
17190 61 72 72 61 79 2e 20 49 66 20 69 74 20 69 73 20  array. If it is 
171a0 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68  large enough, th
171b0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77  is function.** w
171c0 72 69 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20  rites it out to 
171d0 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20  disk. Or, if it 
171e0 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20  is too small to 
171f0 62 6f 74 68 65 72 20 77 69 74 68 2c 20 64 69 73  bother with, dis
17200 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a  cards.** it..**.
17210 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ** Fts5SegWriter
17220 2e 62 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c  .btterm currentl
17230 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  y contains the f
17240 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67  irst term on pag
17250 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  e iBtPage..*/.st
17260 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
17270 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 46 74  iteFlushBtree(Ft
17280 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
17290 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
172a0 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67  er){.  int bFlag
172b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  ;..  assert( pWr
172c0 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c  iter->iBtPage ||
172d0 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
172e0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72  ==0 );.  if( pWr
172f0 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30  iter->iBtPage==0
17300 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c   ) return;.  bFl
17310 61 67 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c  ag = fts5WriteFl
17320 75 73 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69  ushDlidx(p, pWri
17330 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ter);..  if( p->
17340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17350 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
17360 2a 7a 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62  *z = (pWriter->b
17370 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74  tterm.n>0?(const
17380 20 63 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e   char*)pWriter->
17390 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20  btterm.p:"");.  
173a0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
173b0 6e 67 20 77 61 73 20 61 6c 72 65 61 64 79 20 64  ng was already d
173c0 6f 6e 65 20 69 6e 20 66 74 73 35 57 72 69 74 65  one in fts5Write
173d0 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f  Init(): */.    /
173e0 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  * sqlite3_bind_i
173f0 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  nt(p->pIdxWriter
17400 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  , 1, pWriter->iS
17410 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71  egid); */.    sq
17420 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
17430 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32  p->pIdxWriter, 2
17440 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74  , z, pWriter->bt
17450 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53  term.n, SQLITE_S
17460 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
17470 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
17480 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c  ->pIdxWriter, 3,
17490 20 62 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70   bFlag + ((i64)p
174a0 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c  Writer->iBtPage<
174b0 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  <1));.    sqlite
174c0 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72  3_step(p->pIdxWr
174d0 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63  iter);.    p->rc
174e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
174f0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b  (p->pIdxWriter);
17500 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e  .  }.  pWriter->
17510 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a  iBtPage = 0;.}..
17520 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
17530 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
17540 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63  ch leaf page exc
17550 65 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68  ept the first th
17560 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  at contains.** a
17570 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d  t least one term
17580 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72  . Argument (nTer
17590 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20  m/pTerm) is the 
175a0 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65  split-key - a te
175b0 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61  rm that.** is la
175c0 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65  rger than all te
175d0 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65  rms written to e
175e0 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61  arlier leaves, a
175f0 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a  nd equal to or.*
17600 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  * smaller than t
17610 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
17620 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a   the new leaf..*
17630 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
17640 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
17650 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
17660 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
17670 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68  If an error.** h
17680 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
17690 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
176a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
176b0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
176c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
176d0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
176e0 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
176f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17700 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
17710 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
17720 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
17730 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
17740 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
17750 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  ct */.  int nTer
17760 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  m, const u8 *pTe
17770 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  rm      /* First
17780 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67   term on new pag
17790 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72  e */.){.  fts5Wr
177a0 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c  iteFlushBtree(p,
177b0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 66 74 73   pWriter);.  fts
177c0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
177d0 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74  c, &pWriter->btt
177e0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  erm, nTerm, pTer
177f0 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  m);.  pWriter->i
17800 42 74 50 61 67 65 20 3d 20 70 57 72 69 74 65 72  BtPage = pWriter
17810 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d  ->writer.pgno;.}
17820 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
17830 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
17840 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20  when flushing a 
17850 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20 63  leaf page that c
17860 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65  ontains no.** te
17870 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69  rms at all to di
17880 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sk..*/.static vo
17890 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
178a0 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49  eNoTerm(.  Fts5I
178b0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
178c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
178d0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
178e0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
178f0 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20  iter *pWriter   
17900 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
17910 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
17920 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65  /* If there were
17930 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68   no rowids on th
17940 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74 68  e leaf page eith
17950 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69  er and the docli
17960 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61  st-index.  ** ha
17970 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
17980 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61  tarted, append a
17990 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20 69  n 0x00 byte to i
179a0 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  t.  */.  if( pWr
179b0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
179c0 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69 74  dInPage && pWrit
179d0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
179e0 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73  f.n>0 ){.    Fts
179f0 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
17a00 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
17a10 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20  >aDlidx[0];.    
17a20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
17a30 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20  bPrevValid );.  
17a40 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
17a50 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
17a60 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
17a70 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  >buf, 0);.  }.. 
17a80 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
17a90 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71  e "number of seq
17aa0 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77  uential leaves w
17ab0 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63  ithout a term" c
17ac0 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72  ounter. */.  pWr
17ad0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a  iter->nEmpty++;.
17ae0 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  }..static i64 ft
17af0 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69  s5DlidxExtractFi
17b00 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75 66  rstRowid(Fts5Buf
17b10 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36  fer *pBuf){.  i6
17b20 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  4 iRowid;.  int 
17b30 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20  iOff;..  iOff = 
17b40 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  1 + fts5GetVarin
17b50 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28  t(&pBuf->p[1], (
17b60 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
17b70 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
17b80 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  pBuf->p[iOff], (
17b90 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
17ba0 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a   return iRowid;.
17bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69  }../*.** Rowid i
17bc0 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20 62  Rowid has just b
17bd0 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20  een appended to 
17be0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
17bf0 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68 65   page. It is the
17c00 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65  .** first on the
17c10 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
17c20 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20  tion appends an 
17c30 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
17c40 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
17c50 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
17c60 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
17c70 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78  d fts5WriteDlidx
17c80 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e  Append(.  Fts5In
17c90 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
17ca0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
17cb0 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  r, .  i64 iRowid
17cc0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
17cd0 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
17ce0 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
17cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
17d00 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
17d10 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
17d20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
17d30 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74  *pDlidx = &pWrit
17d40 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a  er->aDlidx[i];..
17d50 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
17d60 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
17d70 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
17d80 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
17d90 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61  doclist-index pa
17da0 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74  ge is full. Writ
17db0 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64  e it to disk and
17dc0 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61   push.      ** a
17dd0 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20   copy of iRowid 
17de0 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f  (which will beco
17df0 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  me the first row
17e00 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20  id on the next. 
17e10 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d       ** doclist-
17e20 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65 29  index leaf page)
17e30 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78   up into the nex
17e40 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62  t level of the b
17e50 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20  -tree .      ** 
17e60 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74 68  hierarchy. If th
17e70 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75  e node being flu
17e80 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c  shed is currentl
17e90 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c  y the root node,
17ea0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70  .      ** also p
17eb0 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f  ush its first ro
17ec0 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a  wid upwards. */.
17ed0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
17ee0 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20  f.p[0] = 0x01;  
17ef0 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f    /* Not the roo
17f00 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  t node */.      
17f10 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
17f20 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35   .          FTS5
17f30 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72  _DLIDX_ROWID(pWr
17f40 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
17f50 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a   pDlidx->pgno),.
17f60 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78            pDlidx
17f70 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d  ->buf.p, pDlidx-
17f80 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a  >buf.n.      );.
17f90 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
17fa0 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
17fb0 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20  ter, i+2);.     
17fc0 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74   pDlidx = &pWrit
17fd0 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20  er->aDlidx[i];. 
17fe0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
17ff0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c  SQLITE_OK && pDl
18000 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20  idx[1].buf.n==0 
18010 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
18020 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64  First = fts5Dlid
18030 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77  xExtractFirstRow
18040 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  id(&pDlidx->buf)
18050 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
18060 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20  is was the root 
18070 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20 66  node. Push its f
18080 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f  irst rowid up to
18090 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a   the new root. *
180a0 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  /.        pDlidx
180b0 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64  [1].pgno = pDlid
180c0 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20  x->pgno;.       
180d0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
180e0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
180f0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
18100 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20  ].buf, 0);.     
18110 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18120 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18130 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
18140 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d  [1].buf, pDlidx-
18150 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
18160 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18170 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18180 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
18190 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20  .buf, iFirst);. 
181a0 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
181b0 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b  .bPrevValid = 1;
181c0 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
181d0 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73  1].iPrev = iFirs
181e0 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
181f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
18200 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d  ferZero(&pDlidx-
18210 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c  >buf);.      pDl
18220 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
18230 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  = 0;.      pDlid
18240 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d  x->pgno++;.    }
18250 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e  else{.      bDon
18260 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 1;.    }..  
18270 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50    if( pDlidx->bP
18280 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  revValid ){.    
18290 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20    iVal = iRowid 
182a0 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b  - pDlidx->iPrev;
182b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
182c0 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69    i64 iPgno = (i
182d0 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77  ==0 ? pWriter->w
182e0 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c  riter.pgno : pDl
182f0 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20  idx[-1].pgno);. 
18300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c       assert( pDl
18310 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b  idx->buf.n==0 );
18320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
18330 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
18340 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
18350 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e  lidx->buf, !bDon
18360 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
18370 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
18380 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
18390 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50  &pDlidx->buf, iP
183a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c  gno);.      iVal
183b0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d   = iRowid;.    }
183c0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
183d0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
183e0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
183f0 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b  idx->buf, iVal);
18400 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72  .    pDlidx->bPr
18410 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  evValid = 1;.   
18420 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d   pDlidx->iPrev =
18430 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a   iRowid;.  }.}..
18440 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18450 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46  WriteFlushLeaf(F
18460 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
18470 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18480 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ter){.  static c
18490 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d  onst u8 zero[] =
184a0 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30   { 0x00, 0x00, 0
184b0 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46  x00, 0x00 };.  F
184c0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
184d0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
184e0 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69  >writer;.  i64 i
184f0 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  Rowid;..  assert
18500 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  ( (pPage->pgidx.
18510 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d  n==0)==(pWriter-
18520 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
18530 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  e) );..  /* Set 
18540 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65  the szLeaf heade
18550 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73  r field. */.  as
18560 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74  sert( 0==fts5Get
18570 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
18580 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50  p[2]) );.  fts5P
18590 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  utU16(&pPage->bu
185a0 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62  f.p[2], pPage->b
185b0 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57  uf.n);..  if( pW
185c0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
185d0 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  mInPage ){.    /
185e0 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72  * No term was wr
185f0 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61  itten to this pa
18600 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
18610 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  t( pPage->pgidx.
18620 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  n==0 );.    fts5
18630 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
18640 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
18650 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70  }else{.    /* Ap
18660 70 65 6e 64 20 74 68 65 20 70 67 69 64 78 20 74  pend the pgidx t
18670 6f 20 74 68 65 20 70 61 67 65 20 62 75 66 66 65  o the page buffe
18680 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  r. Set the szLea
18690 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
186a0 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
186b0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
186c0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
186d0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c   pPage->pgidx.n,
186e0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29   pPage->pgidx.p)
186f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
18700 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  e the page out t
18710 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77  o disk */.  iRow
18720 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
18730 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
18740 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e  >iSegid, pPage->
18750 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74  pgno);.  fts5Dat
18760 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64  aWrite(p, iRowid
18770 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20  , pPage->buf.p, 
18780 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a  pPage->buf.n);..
18790 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
187a0 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a  the next page. *
187b0 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  /.  fts5BufferZe
187c0 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b  ro(&pPage->buf);
187d0 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
187e0 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29  o(&pPage->pgidx)
187f0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
18800 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
18810 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
18820 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d   zero);.  pPage-
18830 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b  >iPrevPgidx = 0;
18840 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b  .  pPage->pgno++
18850 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65  ;..  /* Increase
18860 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74   the leaves writ
18870 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ten counter */. 
18880 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57   pWriter->nLeafW
18890 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20  ritten++;..  /* 
188a0 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c  The new leaf hol
188b0 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72  ds no terms or r
188c0 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74  owids */.  pWrit
188d0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
188e0 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
188f0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
18900 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  InPage = 1;.}../
18910 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d  *.** Append term
18920 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20   pTerm/nTerm to 
18930 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  the segment bein
18940 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65  g written by the
18950 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a   writer passed.*
18960 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
18970 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
18980 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
18990 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
189a0 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
189b0 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
189c0 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
189d0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
189e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
189f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
18a00 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
18a10 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49  endTerm(.  Fts5I
18a20 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
18a30 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
18a40 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c  er,.  int nTerm,
18a50 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
18a60 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66   .){.  int nPref
18a70 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
18a80 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
18a90 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65  of prefix compre
18aa0 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a  ssion for term *
18ab0 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  /.  Fts5PageWrit
18ac0 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
18ad0 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
18ae0 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69  Fts5Buffer *pPgi
18af0 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  dx = &pWriter->w
18b00 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20  riter.pgidx;..  
18b10 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
18b20 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
18b30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
18b40 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  .n>=4 );.  asser
18b50 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
18b60 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  4 || pWriter->bF
18b70 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
18b80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
18b90 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
18ba0 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20   is full, flush 
18bb0 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  it to disk. */. 
18bc0 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66   if( (pPage->buf
18bd0 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  .n + pPgidx->n +
18be0 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e   nTerm + 2)>=p->
18bf0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
18c00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
18c10 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
18c20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
18c30 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
18c40 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
18c50 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
18c60 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
18c70 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50  Term+FTS5_DATA_P
18c80 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a  ADDING);.  }.  .
18c90 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61    /* TODO1: Upda
18ca0 74 69 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e  ting pgidx here.
18cb0 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20   */.  pPgidx->n 
18cc0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
18cd0 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26  tVarint(.      &
18ce0 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
18cf0 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
18d00 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65  .n - pPage->iPre
18d10 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50  vPgidx.  );.  pP
18d20 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
18d30 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a  = pPage->buf.n;.
18d40 23 69 66 20 30 0a 20 20 66 74 73 35 50 75 74 55  #if 0.  fts5PutU
18d50 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50  16(&pPgidx->p[pP
18d60 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
18d70 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64  >buf.n);.  pPgid
18d80 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69  x->n += 2;.#endi
18d90 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  f..  if( pWriter
18da0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
18db0 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69  ge ){.    nPrefi
18dc0 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
18dd0 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
18de0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
18df0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
18e00 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
18e10 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
18e20 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
18e30 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
18e40 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
18e50 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
18e60 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
18e70 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
18e80 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
18e90 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
18ea0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18eb0 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
18ec0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
18ed0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
18ee0 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
18ef0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
18f00 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
18f10 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
18f20 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
18f30 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
18f40 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
18f50 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
18f60 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
18f70 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
18f80 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
18f90 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
18fa0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
18fb0 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
18fc0 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
18fd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
18fe0 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
18ff0 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
19000 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
19010 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
19020 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
19030 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
19040 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
19050 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
19060 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
19070 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
19080 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
19090 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
190a0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
190b0 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
190c0 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
190d0 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
190e0 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
190f0 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
19100 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
19110 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
19120 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
19130 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
19140 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
19150 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
19160 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
19170 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
19180 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
19190 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
191a0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
191b0 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
191c0 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
191d0 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
191e0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
191f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19200 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35    nPrefix = fts5
19210 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
19220 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
19230 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
19240 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
19250 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
19260 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
19270 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65  pPage->buf, nPre
19280 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  fix);.  }..  /* 
19290 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65  Append the numbe
192a0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
192b0 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65  w data, then the
192c0 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c   term data itsel
192d0 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  f.  ** to the pa
192e0 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
192f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19300 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
19310 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
19320 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66  efix);.  fts5Buf
19330 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
19340 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
19350 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
19360 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66  ix, &pTerm[nPref
19370 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  ix]);..  /* Upda
19380 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57  te the Fts5PageW
19390 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64  riter.term field
193a0 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
193b0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rSet(&p->rc, &pP
193c0 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d  age->term, nTerm
193d0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69  , pTerm);.  pWri
193e0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
193f0 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57  nPage = 0;..  pW
19400 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
19410 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
19420 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19430 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
19440 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  1;..  assert( p-
19450 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  >rc || (pWriter-
19460 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
19470 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
19480 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70  buf.n==0) );.  p
19490 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
194a0 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  ].pgno = pPage->
194b0 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pgno;.}../*.** A
194c0 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e  ppend a rowid an
194d0 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  d position-list 
194e0 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68  size field to th
194f0 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74  e writers output
19500 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
19510 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
19520 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
19530 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
19540 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
19550 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  r,.  i64 iRowid,
19560 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20  .  int nPos.){. 
19570 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
19590 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
195a0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
195b0 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  riter;..    if( 
195c0 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
195d0 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e  pPage->pgidx.n)>
195e0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
195f0 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  z ){.      fts5W
19600 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
19610 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
19620 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19630 20 69 73 20 74 6f 20 62 65 20 74 68 65 20 66 69   is to be the fi
19640 72 73 74 20 72 6f 77 69 64 20 77 72 69 74 74 65  rst rowid writte
19650 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73  n to the page, s
19660 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  et the .    ** r
19670 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20  owid-pointer in 
19680 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 2e  the page-header.
19690 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61 20 76   Also append a v
196a0 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c 69 64  alue to the dlid
196b0 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2c  x.    ** buffer,
196c0 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69   in case a docli
196d0 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75  st-index is requ
196e0 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ired.  */.    if
196f0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
19700 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
19710 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
19720 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70  (pPage->buf.p, p
19730 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20  Page->buf.n);.  
19740 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
19750 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69  dxAppend(p, pWri
19760 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  ter, iRowid);.  
19770 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74    }..    /* Writ
19780 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a  e the rowid. */.
19790 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
197a0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
197b0 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72  clist || pWriter
197c0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
197d0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
197e0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
197f0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
19800 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29  ge->buf, iRowid)
19810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19820 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
19830 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69 74   || iRowid>pWrit
19840 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29  er->iPrevRowid )
19850 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
19860 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
19870 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
19880 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57 72  uf, iRowid - pWr
19890 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64  iter->iPrevRowid
198a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 72  );.    }.    pWr
198b0 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64  iter->iPrevRowid
198c0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70   = iRowid;.    p
198d0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
198e0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30  widInDoclist = 0
198f0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
19900 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
19910 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74 73 35 42   = 0;..    fts5B
19920 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
19930 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
19940 2d 3e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20  ->buf, nPos);.  
19950 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
19960 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
19970 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46  PoslistData(.  F
19980 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
19990 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
199a0 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74  Writer, .  const
199b0 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69   u8 *aData, .  i
199c0 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74  nt nData.){.  Ft
199d0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
199e0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
199f0 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20  writer;.  const 
19a00 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20  u8 *a = aData;. 
19a10 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a   int n = nData;.
19a20 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e    .  assert( p->
19a30 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20  pConfig->pgsz>0 
19a40 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
19a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
19a60 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75     && (pPage->bu
19a70 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69  f.n + pPage->pgi
19a80 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43  dx.n + n)>=p->pC
19a90 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29  onfig->pgsz .  )
19aa0 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d  {.    int nReq =
19ab0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
19ac0 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  z - pPage->buf.n
19ad0 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   - pPage->pgidx.
19ae0 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  n;.    int nCopy
19af0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
19b00 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20   nCopy<nReq ){. 
19b10 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a       i64 dummy;.
19b20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66        nCopy += f
19b30 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
19b40 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64  nCopy], (u64*)&d
19b50 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ummy);.    }.   
19b60 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19b70 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
19b80 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79  Page->buf, nCopy
19b90 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e  , a);.    a += n
19ba0 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e  Copy;.    n -= n
19bb0 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72  Copy;.    fts5Wr
19bc0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
19bd0 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pWriter);.  }.  
19be0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66  if( n>0 ){.    f
19bf0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
19c00 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
19c10 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a  ge->buf, n, a);.
19c20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75    }.}../*.** Flu
19c30 73 68 20 61 6e 79 20 64 61 74 61 20 63 61 63 68  sh any data cach
19c40 65 64 20 62 79 20 74 68 65 20 77 72 69 74 65 72  ed by the writer
19c50 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64   object to the d
19c60 61 74 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e  atabase. Free an
19c70 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  y.** allocations
19c80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19c90 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a   the writer..*/.
19ca0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
19cb0 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46  WriteFinish(.  F
19cc0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
19cd0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
19ce0 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
19cf0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
19d00 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61   */.  int *pnLea
19d10 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
19d20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
19d30 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
19d40 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a  es in b-tree */.
19d50 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
19d60 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 4c  s5PageWriter *pL
19d70 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  eaf = &pWriter->
19d80 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70 2d  writer;.  if( p-
19d90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19da0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
19db0 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a  eaf->pgno>=1 );.
19dc0 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62      if( pLeaf->b
19dd0 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20  uf.n>4 ){.      
19de0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
19df0 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
19e00 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61      }.    *pnLea
19e10 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d  f = pLeaf->pgno-
19e20 31 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  1;.    fts5Write
19e30 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57  FlushBtree(p, pW
19e40 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66 74  riter);.  }.  ft
19e50 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
19e60 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  eaf->term);.  ft
19e70 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
19e80 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  eaf->buf);.  fts
19e90 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65  5BufferFree(&pLe
19ea0 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74  af->pgidx);.  ft
19eb0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
19ec0 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a  riter->btterm);.
19ed0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
19ee0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
19ef0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
19f00 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
19f10 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
19f20 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73  i].buf);.  }.  s
19f30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
19f40 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a  ter->aDlidx);.}.
19f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19f60 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74  5WriteInit(.  Ft
19f70 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
19f80 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19f90 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53  riter, .  int iS
19fa0 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  egid.){.  const 
19fb0 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d  int nBuffer = p-
19fc0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b  >pConfig->pgsz +
19fd0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49   FTS5_DATA_PADDI
19fe0 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57  NG;..  memset(pW
19ff0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1a000 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1a010 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
1a020 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20  gid = iSegid;.. 
1a030 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
1a040 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
1a050 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77  1);.  pWriter->w
1a060 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a  riter.pgno = 1;.
1a070 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1a080 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
1a090 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
1a0a0 61 67 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 47  age = 1;..  /* G
1a0b0 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66  row the two buff
1a0c0 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61  ers to pgsz + pa
1a0d0 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73  dding bytes in s
1a0e0 69 7a 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  ize. */.  fts5Bu
1a0f0 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
1a100 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1a110 72 2e 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72  r.pgidx, nBuffer
1a120 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 47  );.  fts5BufferG
1a130 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  row(&p->rc, &pWr
1a140 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1a150 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69  , nBuffer);..  i
1a160 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72  f( p->pIdxWriter
1a170 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
1a180 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
1a190 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
1a1a0 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
1a1b0 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
1a1c0 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  xWriter, sqlite3
1a1d0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
1a1e0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1a1f0 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73   '%q'.'%q_idx'(s
1a200 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20  egid,term,pgno) 
1a210 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20  VALUES(?,?,?)", 
1a220 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
1a230 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
1a240 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
1a250 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1a260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a270 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1a280 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66   the 4-byte leaf
1a290 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20  -page header to 
1a2a0 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d  0x00. */.    mem
1a2b0 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69  set(pWriter->wri
1a2c0 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29  ter.buf.p, 0, 4)
1a2d0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77  ;.    pWriter->w
1a2e0 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b  riter.buf.n = 4;
1a2f0 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68  ..    /* Bind th
1a300 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
1a310 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74   segment id to t
1a320 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e  he index-writer.
1a330 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20   This is an.    
1a340 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1a350 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  over binding the
1a360 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72   same value over
1a370 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77   and over as row
1a380 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  s are.    ** ins
1a390 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78  erted into %_idx
1a3a0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1a3b0 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  writer.  */.    
1a3c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1a3d0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1a3e0 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1a3f0 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  id);.  }.}../*.*
1a400 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
1a410 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
1a420 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1a430 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1a440 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
1a450 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
1a460 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
1a470 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1a480 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
1a490 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
1a4a0 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
1a4b0 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
1a4c0 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
1a4d0 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
1a4e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1a4f0 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1a500 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1a510 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
1a520 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
1a530 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
1a540 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
1a550 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1a560 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  fer));.  for(i=0
1a570 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
1a580 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53   i++){.    Fts5S
1a590 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
1a5a0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
1a5b0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53      if( pSeg->pS
1a5c0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  eg==0 ){.      /
1a5d0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
1a5e0 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70  else if( pSeg->p
1a5f0 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
1a600 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f   /* All keys fro
1a610 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67  m this input seg
1a620 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74  ment have been t
1a630 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65  ransfered to the
1a640 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1a650 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66  * Set both the f
1a660 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61  irst and last pa
1a670 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20  ge-numbers to 0 
1a680 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1a690 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1a6a0 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70  gment is now emp
1a6b0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65  ty. */.      pSe
1a6c0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  g->pSeg->pgnoLas
1a6d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
1a6e0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
1a6f0 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
1a700 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  e{.      int iOf
1a710 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  f = pSeg->iTermL
1a720 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f  eafOffset;     /
1a730 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20  * Offset on new 
1a740 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
1a750 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65  */.      i64 iLe
1a760 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46  afRowid;.      F
1a770 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
1a780 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20        int iId = 
1a790 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
1a7a0 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64  id;.      u8 aHd
1a7b0 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78  r[4] = {0x00, 0x
1a7c0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b  00, 0x00, 0x00};
1a7d0 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77  ..      iLeafRow
1a7e0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1a7f0 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65  T_ROWID(iId, pSe
1a800 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1a810 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  );.      pData =
1a820 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
1a830 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1a840 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b      if( pData ){
1a850 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1a860 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20  ferZero(&buf);. 
1a870 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1a880 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62  rGrow(&p->rc, &b
1a890 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a  uf, pData->nn);.
1a8a0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a8b0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1a8c0 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f  >rc, &buf, sizeo
1a8d0 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a  f(aHdr), aHdr);.
1a8e0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a8f0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1a900 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1a910 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  g->term.n);.    
1a920 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1a930 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1a940 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1a950 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  m.n, pSeg->term.
1a960 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
1a970 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1a980 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1a990 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66  Data->szLeaf-iOf
1a9a0 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  f, &pData->p[iOf
1a9b0 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f]);.        if(
1a9c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a9d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
1a9e0 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66  * Set the szLeaf
1a9f0 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20   field */.      
1aa00 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
1aa10 62 75 66 2e 70 5b 32 5d 2c 20 62 75 66 2e 6e 29  buf.p[2], buf.n)
1aa20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1aa30 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74       /* Set up t
1aa40 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65  he new page-inde
1aa50 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  x array */.     
1aa60 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1aa70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1aa80 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  , &buf, 4);.    
1aa90 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
1aaa0 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69  eafPgno==pSeg->i
1aab0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20  TermLeafPgno .  
1aac0 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e         && pSeg->
1aad0 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44  iEndofDoclist<pD
1aae0 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20  ata->szLeaf .   
1aaf0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1ab00 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44    int nDiff = pD
1ab10 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  ata->szLeaf - pS
1ab20 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1ab30 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  t;.          fts
1ab40 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1ab50 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1ab60 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44  , buf.n - 1 - nD
1ab70 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  iff - 4);.      
1ab80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1ab90 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1aba0 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20   &buf, .        
1abb0 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20        pData->nn 
1abc0 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  - pSeg->iPgidxOf
1abd0 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65  f, &pData->p[pSe
1abe0 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20  g->iPgidxOff].  
1abf0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1ac00 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
1ac10 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
1ac20 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53  ata);.        pS
1ac30 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1ac40 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  rst = pSeg->iTer
1ac50 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20  mLeafPgno;.     
1ac60 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74     fts5DataDelet
1ac70 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  e(p, FTS5_SEGMEN
1ac80 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c  T_ROWID(iId, 1),
1ac90 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1aca0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1acb0 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1acc0 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1acd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ace0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1acf0 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73  Free(&buf);.}..s
1ad00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1ad10 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1ad20 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1ad30 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  p, .  void *pCtx
1ad40 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1ad50 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1ad60 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72  k.){.  Fts5SegWr
1ad70 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
1ad80 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29  (Fts5SegWriter*)
1ad90 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74  pCtx;.  fts5Writ
1ada0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1adb0 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70  ta(p, pWriter, p
1adc0 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1add0 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
1ade0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1adf0 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
1ae00 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae20 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1ae30 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1ae40 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1ae50 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1ae60 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
1ae70 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1ae80 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aea0 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
1aeb0 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
1aec0 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aee0 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
1aef0 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
1af00 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
1af10 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1af20 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1af30 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1af40 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1af50 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1af60 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
1af70 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1af80 4f 75 74 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  Out;.  Fts5Index
1af90 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
1afa0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
1afb0 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
1afc0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
1afd0 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70  Rem = pnRem ? *p
1afe0 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75  nRem : 0;  /* Ou
1aff0 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
1b000 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
1b010 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b030 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b040 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1b050 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
1b060 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
1b070 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1b080 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1b090 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1b0a0 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
1b0b0 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
1b0c0 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
1b0d0 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  ;.  int bOldest;
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1b100 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1b110 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
1b120 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
1b130 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1b140 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1b150 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1b160 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1b170 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1b180 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1b190 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1b1a0 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1b1b0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1b1c0 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
1b1d0 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
1b1e0 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1b1f0 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1b200 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
1b210 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
1b220 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
1b230 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53  ->nMerge;.    pS
1b240 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1b250 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1b260 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  g-1];..    fts5W
1b270 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1b280 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  ter, pSeg->iSegi
1b290 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77  d);.    writer.w
1b2a0 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65  riter.pgno = pSe
1b2b0 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20  g->pgnoLast+1;. 
1b2c0 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67     writer.iBtPag
1b2d0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1b2e0 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
1b2f0 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1b300 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1b310 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74  .    /* Extend t
1b320 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1b330 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69   object as requi
1b340 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  red to ensure th
1b350 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
1b360 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20  segment exists. 
1b370 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d  */.    if( iLvl=
1b380 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
1b390 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  -1 ){.      fts5
1b3a0 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1b3b0 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75  l(&p->rc, ppStru
1b3c0 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  ct);.      pStru
1b3d0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1b3e0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1b3f0 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
1b400 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
1b410 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30  ct, iLvl+1, 1, 0
1b420 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1b430 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
1b440 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1b450 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1b460 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1b470 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b480 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  l+1];..    fts5W
1b490 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1b4a0 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1b4b0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
1b4c0 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  w segment to the
1b4d0 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f   output level */
1b4e0 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
1b4f0 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
1b500 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70  ut->nSeg];.    p
1b510 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a  LvlOut->nSeg++;.
1b520 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
1b530 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65  rst = 1;.    pSe
1b540 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1b550 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  id;.    pStruct-
1b560 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20  >nSegment++;..  
1b570 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20    /* Read input 
1b580 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74  from all segment
1b590 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
1b5a0 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70  evel */.    nInp
1b5b0 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  ut = pLvl->nSeg;
1b5c0 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d  .  }.  bOldest =
1b5d0 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d   (pLvlOut->nSeg=
1b5e0 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e  =1 && pStruct->n
1b5f0 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a  Level==iLvl+2);.
1b600 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e  .  assert( iLvl>
1b610 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35  =0 );.  for(fts5
1b620 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1b630 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30  pStruct, 0, 0, 0
1b640 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
1b650 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
1b660 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
1b670 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
1b680 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1b690 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
1b6a0 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
1b6b0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1b6c0 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
1b6d0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1b6e0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1b6f0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b710 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
1b720 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
1b730 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
1b740 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
1b750 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
1b760 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
1b770 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e  key annihilation
1b780 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  . */.    if( pSe
1b790 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26  gIter->nPos==0 &
1b7a0 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53  & (bOldest || pS
1b7b0 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29  egIter->bDel==0)
1b7c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1b7d0 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75    pTerm = fts5Mu
1b7e0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
1b7f0 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  r, &nTerm);.    
1b800 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
1b810 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
1b820 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
1b830 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1b840 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e  nRem && writer.n
1b850 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d  LeafWritten>nRem
1b860 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1b870 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1b880 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1b890 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
1b8a0 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
1b8b0 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
1b8c0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1b8d0 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77  AppendTerm(p, &w
1b8e0 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54  riter, nTerm, pT
1b8f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35  erm);.      fts5
1b900 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1b910 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
1b920 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  pTerm);.    }.. 
1b930 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
1b940 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75   rowid to the ou
1b950 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57  tput */.    /* W
1b960 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
1b970 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d 20 70 53  */.    nPos = pS
1b980 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b  egIter->nPos*2 +
1b990 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b   pSegIter->bDel;
1b9a0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
1b9b0 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72  pendRowid(p, &wr
1b9c0 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49  iter, fts5MultiI
1b9d0 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c  terRowid(pIter),
1b9e0 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20   nPos);..    /* 
1b9f0 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
1ba00 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
1ba10 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
1ba20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1ba30 61 74 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c  ate(p, pSegIter,
1ba40 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c   (void*)&writer,
1ba50 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
1ba60 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 0a 20  allback);.  }.. 
1ba70 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61   /* Flush the la
1ba80 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20  st leaf page to 
1ba90 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75  disk. Set the ou
1baa0 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74  tput segment b-t
1bab0 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20  ree height.  ** 
1bac0 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61  and last leaf pa
1bad0 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65  ge number at the
1bae0 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a   same time.  */.
1baf0 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
1bb00 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
1bb10 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg->pgnoLast);.
1bb20 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69  .  if( fts5Multi
1bb30 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
1bb40 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
1bb50 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
1bb60 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
1bb70 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25  ments from the %
1bb80 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
1bb90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49     for(i=0; i<nI
1bba0 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nput; i++){.    
1bbb0 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65    fts5DataRemove
1bbc0 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d  Segment(p, pLvl-
1bbd0 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29  >aSeg[i].iSegid)
1bbe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bbf0 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
1bc00 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
1bc10 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  om the input lev
1bc20 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  el */.    if( pL
1bc30 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74  vl->nSeg!=nInput
1bc40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
1bc50 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65  ove = (pLvl->nSe
1bc60 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69  g - nInput) * si
1bc70 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1bc80 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
1bc90 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e    memmove(pLvl->
1bca0 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  aSeg, &pLvl->aSe
1bcb0 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65  g[nInput], nMove
1bcc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  );.    }.    pSt
1bcd0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d  ruct->nSegment -
1bce0 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
1bcf0 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70  vl->nSeg -= nInp
1bd00 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  ut;.    pLvl->nM
1bd10 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  erge = 0;.    if
1bd20 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ( pSeg->pgnoLast
1bd30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76  ==0 ){.      pLv
1bd40 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  lOut->nSeg--;.  
1bd50 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1bd60 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  gment--;.    }. 
1bd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1bd80 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  rt( pSeg->pgnoLa
1bd90 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35  st>0 );.    fts5
1bda0 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20  TrimSegments(p, 
1bdb0 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c  pIter);.    pLvl
1bdc0 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75  ->nMerge = nInpu
1bdd0 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75  t;.  }..  fts5Mu
1bde0 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
1bdf0 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  Iter);.  fts5Buf
1be00 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
1be10 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70    if( pnRem ) *p
1be20 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e  nRem -= writer.n
1be30 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a  LeafWritten;.}..
1be40 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e  /*.** Do up to n
1be50 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f  Pg pages of auto
1be60 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68  merge work on th
1be70 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  e index..*/.stat
1be80 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1be90 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  xMerge(.  Fts5In
1bea0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1beb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1bec0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1bed0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1bee0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
1bef0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1bf00 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
1bf10 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1bf20 20 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20   int nPg        
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72   /* Pages of wor
1bf50 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20  k to do */.){.  
1bf60 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a  int nRem = nPg;.
1bf70 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1bf80 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1bf90 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e  ruct;.  while( n
1bfa0 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d  Rem>0 && p->rc==
1bfb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bfc0 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bfe0 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
1bff0 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
1c000 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20   int iBestLvl = 
1c010 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1c020 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74  Level offering t
1c030 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65  he most input se
1c040 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  gments */.    in
1c050 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20  t nBest = 0;    
1c060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c070 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
1c080 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65  ments on best le
1c090 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  vel */..    /* S
1c0a0 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74  et iBestLvl to t
1c0b0 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64  he level to read
1c0c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1c0d0 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73  from. */.    ass
1c0e0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c  ert( pStruct->nL
1c0f0 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f  evel>0 );.    fo
1c100 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1c110 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1c120 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iLvl++){.      F
1c130 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1c140 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
1c150 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1c160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
1c170 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
1c180 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
1c190 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20  erge>nBest ){.  
1c1a0 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c          iBestLvl
1c1b0 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20   = iLvl;.       
1c1c0 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
1c1d0 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20  >nMerge;.       
1c1e0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1c1f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c200 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e  if( pLvl->nSeg>n
1c210 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
1c220 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nBest = pLvl->nS
1c230 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73  eg;.        iBes
1c240 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
1c250 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1c260 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73  /* If nBest is s
1c270 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65  till 0, then the
1c280 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65   index must be e
1c290 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20  mpty. */.#ifdef 
1c2a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1c2b0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65   for(iLvl=0; nBe
1c2c0 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53  st==0 && iLvl<pS
1c2d0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1c2e0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  Lvl++){.      as
1c2f0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
1c300 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1c310 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ==0 );.    }.#en
1c320 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65  dif..    if( nBe
1c330 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  st<p->pConfig->n
1c340 41 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20  Automerge .     
1c350 20 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61     && pStruct->a
1c360 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
1c370 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20  nMerge==0 .     
1c380 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1c390 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
1c3a0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1c3b0 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
1c3c0 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
1c3d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c3e0 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
1c3f0 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
1c400 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  vl].nMerge==0 ){
1c410 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1c420 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
1c430 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75  BestLvl+1, pStru
1c440 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ct);.    }.  }. 
1c450 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
1c460 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ruct;.}../*.** A
1c470 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20   total of nLeaf 
1c480 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61  leaf pages of da
1c490 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ta has just been
1c4a0 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65   flushed to a le
1c4b0 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74  vel-0.** segment
1c4c0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1c4d0 75 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74  updates the writ
1c4e0 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64  e-counter accord
1c4f0 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a  ingly and, if.**
1c500 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66   necessary, perf
1c510 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c  orms incremental
1c520 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a   merge work..**.
1c530 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c540 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
1c550 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
1c560 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
1c570 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
1c580 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1c590 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c5a0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1c5b0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1c5c0 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73  Automerge(.  Fts
1c5d0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5f0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1c600 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1c610 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1c620 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1c630 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1c640 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1c650 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
1c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c670 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c680 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
1c690 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
1c6a0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1c6b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
1c6c0 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
1c6d0 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  ge>0 ){.    Fts5
1c6e0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1c6f0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1c700 20 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20      u64 nWrite; 
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
1c730 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e  ue of write-coun
1c740 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
1c750 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
1c760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c770 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74  er of work-quant
1c780 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  a to perform */.
1c790 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20      int nRem;   
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1c7c0 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
1c7d0 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20  o write */..    
1c7e0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72  /* Update the wr
1c7f0 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69  ite-counter. Whi
1c800 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74  le doing so, set
1c810 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e   nWork. */.    n
1c820 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d  Write = pStruct-
1c830 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1c840 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74      nWork = (int
1c850 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65  )(((nWrite + nLe
1c860 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  af) / p->nWorkUn
1c870 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20  it) - (nWrite / 
1c880 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a  p->nWorkUnit));.
1c890 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72      pStruct->nWr
1c8a0 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c  iteCounter += nL
1c8b0 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20  eaf;.    nRem = 
1c8c0 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e  (int)(p->nWorkUn
1c8d0 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74  it * nWork * pSt
1c8e0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a  ruct->nLevel);..
1c8f0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1c900 67 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20  ge(p, ppStruct, 
1c910 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  nRem);.  }.}..st
1c920 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1c930 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a  dexCrisismerge(.
1c940 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1c970 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1c980 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1c990 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a  Struct        /*
1c9a0 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1c9b0 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1c9c0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  dex */.){.  cons
1c9d0 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20  t int nCrisis = 
1c9e0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69  p->pConfig->nCri
1c9f0 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35  sisMerge;.  Fts5
1ca00 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1ca10 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1ca20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a    int iLvl = 0;.
1ca30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1ca40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1ca50 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30  Struct->nLevel>0
1ca60 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
1ca70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ca80 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1ca90 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72  [iLvl].nSeg>=nCr
1caa0 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35  isis ){.    fts5
1cab0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1cac0 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76  p, &pStruct, iLv
1cad0 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  l, 0);.    asser
1cae0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
1caf0 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e  _OK || pStruct->
1cb00 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20  nLevel>(iLvl+1) 
1cb10 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1cb20 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
1cb30 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b  Lvl+1, pStruct);
1cb40 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d  .    iLvl++;.  }
1cb50 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70  .  *ppStruct = p
1cb60 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69  Struct;.}..stati
1cb70 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52  c int fts5IndexR
1cb80 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20  eturn(Fts5Index 
1cb90 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1cba0 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d  p->rc;.  p->rc =
1cbb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65   SQLITE_OK;.  re
1cbc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65  turn rc;.}..type
1cbd0 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46  def struct Fts5F
1cbe0 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73  lushCtx Fts5Flus
1cbf0 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73  hCtx;.struct Fts
1cc00 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74  5FlushCtx {.  Ft
1cc10 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20  s5Index *pIdx;. 
1cc20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
1cc30 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a  riter; .};../*.*
1cc40 2a 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20  * Buffer aBuf[] 
1cc50 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20  contains a list 
1cc60 6f 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20  of varints, all 
1cc70 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20  small enough to 
1cc80 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62  fit.** in a 32-b
1cc90 69 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75  it integer. Retu
1cca0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1ccb0 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69  he largest prefi
1ccc0 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69  x of this .** li
1ccd0 73 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72  st nMax bytes or
1cce0 20 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a   less in size..*
1ccf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1cd00 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63  5PoslistPrefix(c
1cd10 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69  onst u8 *aBuf, i
1cd20 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  nt nMax){.  int 
1cd30 72 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79  ret;.  u32 dummy
1cd40 3b 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65  ;.  ret = fts5Ge
1cd50 74 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20  tVarint32(aBuf, 
1cd60 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65  dummy);.  if( re
1cd70 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68  t<nMax ){.    wh
1cd80 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
1cd90 69 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74 56  int i = fts5GetV
1cda0 61 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65  arint32(&aBuf[re
1cdb0 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  t], dummy);.    
1cdc0 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20    if( (ret + i) 
1cdd0 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a  > nMax ) break;.
1cde0 20 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a        ret += i;.
1cdf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ce00 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69  rn ret;.}..#defi
1ce10 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66  ne fts5BufferSaf
1ce20 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1ce30 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20  , pBlob, nBlob) 
1ce40 7b 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74  {     \.  assert
1ce50 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
1ce60 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c  >=((pBuf)->n+nBl
1ce70 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20 20 20  ob) );          
1ce80 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28     \.  memcpy(&(
1ce90 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d  pBuf)->p[(pBuf)-
1cea0 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  >n], pBlob, nBlo
1ceb0 62 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  b);             
1cec0 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d  \.  (pBuf)->n +=
1ced0 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
1cf00 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
1cf10 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
1cf20 72 69 6e 74 28 70 42 75 66 2c 20 69 56 61 6c 29  rint(pBuf, iVal)
1cf30 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
1cf40 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20    \.  (pBuf)->n 
1cf50 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
1cf60 74 56 61 72 69 6e 74 28 26 28 70 42 75 66 29 2d  tVarint(&(pBuf)-
1cf70 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28  >p[(pBuf)->n], (
1cf80 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73  iVal));  \.  ass
1cf90 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70  ert( (pBuf)->nSp
1cfa0 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29  ace>=(pBuf)->n )
1cfb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cfc0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
1cfd0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  /*.** Flush the 
1cfe0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d  contents of in-m
1cff0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
1d000 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20   iHash to a new 
1d010 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d  level-0 .** segm
1d020 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73  ent on disk. Als
1d030 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72  o update the cor
1d040 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63  responding struc
1d050 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
1d060 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1d070 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
1d080 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
1d090 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
1d0a0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
1d0b0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1d0c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1d0d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1d0e0 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68  c void fts5Flush
1d0f0 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65  OneHash(Fts5Inde
1d100 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73  x *p){.  Fts5Has
1d110 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48  h *pHash = p->pH
1d120 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63  ash;.  Fts5Struc
1d130 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
1d140 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69   int iSegid;.  i
1d150 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61   /* Last leaf pa
1d180 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67  ge number in seg
1d190 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  ment */..  /* Ob
1d1a0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
1d1b0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74   to the index st
1d1c0 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f  ructure and allo
1d1d0 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
1d1e0 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74  nt-id.  ** for t
1d1f0 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73  he new level-0 s
1d200 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53  egment.  */.  pS
1d210 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1d220 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
1d230 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
1d240 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
1d250 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69  truct);..  if( i
1d260 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e  Segid ){.    con
1d270 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d  st int pgsz = p-
1d280 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a  >pConfig->pgsz;.
1d290 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1d2a0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
1d2b0 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e     /* New segmen
1d2c0 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63 74  t within pStruct
1d2d0 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
1d2e0 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
1d2f0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1d300 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
1d310 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a  mble leaf page *
1d320 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1d330 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20 20   *pPgidx;       
1d340 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1d350 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1d360 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20  le pgidx */..   
1d370 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
1d380 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57  riter;.    fts5W
1d390 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1d3a0 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1d3b0 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74 65     pBuf = &write
1d3c0 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20  r.writer.buf;.  
1d3d0 20 20 70 50 67 69 64 78 20 3d 20 26 77 72 69 74    pPgidx = &writ
1d3e0 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  er.writer.pgidx;
1d3f0 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69  ..    /* fts5Wri
1d400 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20  teInit() should 
1d410 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  have initialized
1d420 20 74 68 65 20 62 75 66 66 65 72 73 20 74 6f 20   the buffers to 
1d430 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20  (most likely).  
1d440 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
1d450 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 2e   space required.
1d460 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d470 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e  p->rc || pBuf->n
1d480 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
1d490 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1d4a0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
1d4b0 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78   p->rc || pPgidx
1d4c0 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20  ->nSpace>=(pgsz 
1d4d0 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
1d4e0 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ING) );..    /* 
1d4f0 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74  Begin scanning t
1d500 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c  hrough hash tabl
1d510 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20  e entries. This 
1d520 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
1d530 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74  or each.    ** t
1d540 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72  erm/doclist curr
1d550 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74  ently stored wit
1d560 68 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62  hin the hash tab
1d570 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
1d580 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1d590 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1d5a0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1d5b0 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20  ScanInit(pHash, 
1d5c0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1d5d0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1d5e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73  QLITE_OK && 0==s
1d5f0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1d600 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a  anEof(pHash) ){.
1d610 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d620 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *zTerm;        
1d630 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
1d640 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20  aining term */. 
1d650 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
1d660 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1d670 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
1d680 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  oclist for this 
1d690 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  term */.      in
1d6a0 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
1d6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d6c0 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  e of doclist in 
1d6d0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20  bytes */..      
1d6e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 72  /* Write the ter
1d6f0 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  m for this entry
1d700 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20   to disk. */.   
1d710 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1d720 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73  shScanEntry(pHas
1d730 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63  h, &zTerm, &pDoc
1d740 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29  list, &nDoclist)
1d750 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
1d760 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26  eAppendTerm(p, &
1d770 77 72 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72  writer, (int)str
1d780 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e  len(zTerm), (con
1d790 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a  st u8*)zTerm);..
1d7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72        assert( wr
1d7b0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1d7c0 49 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20  InPage==0 );.   
1d7d0 20 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42     if( pgsz>=(pB
1d7e0 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
1d7f0 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31  n + nDoclist + 1
1d800 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1d810 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
1d820 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  st will fit on t
1d830 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1d840 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
1d850 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1d860 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c  Blob(pBuf, pDocl
1d870 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
1d880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d890 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1d8a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
1d8b0 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
1d8c0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1d8d0 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
1d8e0 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
1d8f0 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  t will not fit o
1d900 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65  n this leaf. The
1d910 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
1d920 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72      ** loop iter
1d930 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  ates through the
1d940 20 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d   poslists that m
1d950 61 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65  ake up the curre
1d960 6e 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  nt .        ** d
1d970 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20  oclist.  */.    
1d980 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1d990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1d9a0 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a  Off<nDoclist ){.
1d9b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
1d9c0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  os;.          in
1d9d0 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  t nCopy;.       
1d9e0 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
1d9f0 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
1da00 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1da10 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
1da20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
1da30 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
1da40 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
1da50 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69  Size(&pDoclist[i
1da60 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
1da70 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20  ummy);.         
1da80 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a   nCopy += nPos;.
1da90 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1daa0 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
1dab0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
1dac0 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72   if( writer.bFir
1dad0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
1dae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1daf0 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70  5PutU16(&pBuf->p
1db00 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20  [0], pBuf->n);  
1db10 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   /* first rowid 
1db20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  on page */.     
1db30 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
1db40 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
1db50 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1db60 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64  pBuf->n], iRowid
1db70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  );.            w
1db80 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
1db90 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  dInPage = 0;.   
1dba0 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
1dbb0 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
1dbc0 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64   &writer, iRowid
1dbd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1dbe0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1dbf0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1dc00 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
1dc10 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1dc20 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
1dc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dc40 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
1dc50 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
1dc60 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
1dc70 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  ( (pBuf->n + pPg
1dc80 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20  idx->n + nCopy) 
1dc90 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  <= pgsz ){.     
1dca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
1dcb0 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
1dcc0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
1dcd0 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f  rent leaf. So co
1dce0 70 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  py.            *
1dcf0 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20  * it in one go. 
1dd00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  */.            f
1dd10 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1dd20 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
1dd30 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e  Doclist[iOff], n
1dd40 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
1dd50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dd60 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1dd70 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e  e poslist will n
1dd80 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
1dd90 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73  eaf. So it needs
1dda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ddb0 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74  to be broken int
1ddc0 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20  o sections. The 
1ddd0 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69  only qualificati
1dde0 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20  on being.       
1ddf0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63       ** that eac
1de00 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65  h varint must be
1de10 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f   stored contiguo
1de20 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  usly.  */.      
1de30 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
1de40 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63  pPoslist = &pDoc
1de50 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  list[iOff];.    
1de60 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73          int iPos
1de70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1de80 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1de90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dea0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
1deb0 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70  Space = pgsz - p
1dec0 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d  Buf->n - pPgidx-
1ded0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >n;.            
1dee0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
1def0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1df00 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e  nCopy - iPos)<=n
1df10 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
1df20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f           n = nCo
1df30 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20  py - iPos;.     
1df40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50  n = fts5PoslistP
1df70 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b  refix(&pPoslist[
1df80 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a  iPos], nSpace);.
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1dfb0 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20  sert( n>0 );.   
1dfc0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1dfd0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1dfe0 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c  lob(pBuf, &pPosl
1dff0 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20  ist[iPos], n);. 
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
1e010 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
1e020 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
1e030 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
1e040 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
1e050 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
1e060 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26  teFlushLeaf(p, &
1e070 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
1e080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e090 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e         if( iPos>
1e0a0 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a  =nCopy ) break;.
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e0c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e0d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70      iOff += nCop
1e0e0 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  y;.        }.   
1e0f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
1e100 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65  ODO2: Doclist te
1e110 72 6d 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e  rminator written
1e120 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20   here. */.      
1e130 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  /* pBuf->p[pBuf-
1e140 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f  >n++] = '\0'; */
1e150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e160 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53  Buf->n<=pBuf->nS
1e170 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 73 71  pace );.      sq
1e180 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1e190 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20  nNext(pHash);.  
1e1a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
1e1b0 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts5HashClear(pHa
1e1c0 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  sh);.    fts5Wri
1e1d0 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
1e1e0 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b  ter, &pgnoLast);
1e1f0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
1e200 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  the Fts5Structur
1e210 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e  e. It is written
1e220 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
1e230 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20  abase by the.   
1e240 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72   ** fts5Structur
1e250 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20  eRelease() call 
1e260 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69  below.  */.    i
1e270 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f( pStruct->nLev
1e280 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  el==0 ){.      f
1e290 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
1e2a0 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53  evel(&p->rc, &pS
1e2b0 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
1e2c0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
1e2d0 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
1e2e0 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31  c, pStruct, 0, 1
1e2f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
1e300 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1e310 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26  {.      pSeg = &
1e320 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1e330 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74  0].aSeg[ pStruct
1e340 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67  ->aLevel[0].nSeg
1e350 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67  ++ ];.      pSeg
1e360 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1e370 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  d;.      pSeg->p
1e380 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
1e390 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61      pSeg->pgnoLa
1e3a0 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  st = pgnoLast;. 
1e3b0 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53       pStruct->nS
1e3c0 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  egment++;.    }.
1e3d0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1e3e0 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70  ePromote(p, 0, p
1e3f0 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20  Struct);.  }..  
1e400 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
1e410 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  ge(p, &pStruct, 
1e420 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73  pgnoLast);.  fts
1e430 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67  5IndexCrisismerg
1e440 65 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a  e(p, &pStruct);.
1e450 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
1e460 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29  rite(p, pStruct)
1e470 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
1e480 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1e490 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  );.}../*.** Flus
1e4a0 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  h any data store
1e4b0 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
1e4c0 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ry hash tables t
1e4d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
1e4e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e4f0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74  ts5IndexFlush(Ft
1e500 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f  s5Index *p){.  /
1e510 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65  * Unless it is e
1e520 6d 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20  mpty, flush the 
1e530 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69  hash table to di
1e540 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  sk */.  if( p->n
1e550 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20  PendingData ){. 
1e560 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48     assert( p->pH
1e570 61 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50  ash );.    p->nP
1e580 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
1e590 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65      fts5FlushOne
1e5a0 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  Hash(p);.  }.}..
1e5b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1e5c0 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74  IndexOptimize(Ft
1e5d0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
1e5e0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1e5f0 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72  truct;.  Fts5Str
1e600 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30  ucture *pNew = 0
1e610 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30  ;.  int nSeg = 0
1e620 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1e630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1e640 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
1e650 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20  h(p);.  pStruct 
1e660 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
1e670 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ead(p);..  if( p
1e680 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73  Struct ){.    as
1e690 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
1e6a0 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
1e6b0 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
1e6c0 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
1e6d0 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
1e6e0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
1e6f0 20 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a    if( nSeg>1 ){.
1e700 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
1e710 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  = sizeof(Fts5Str
1e720 75 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e  ucture);.      n
1e730 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74  Byte += (pStruct
1e740 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69  ->nLevel+1) * si
1e750 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1e760 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  reLevel);.      
1e770 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75  pNew = (Fts5Stru
1e780 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74  cture*)sqlite3Ft
1e790 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
1e7a0 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
1e7b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65   }.  }.  if( pNe
1e7c0 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  w ){.    Fts5Str
1e7d0 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
1e7e0 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  l;.    int nByte
1e7f0 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66   = nSeg * sizeof
1e800 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1e810 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77  gment);.    pNew
1e820 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  ->nLevel = pStru
1e830 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20  ct->nLevel+1;.  
1e840 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
1e850 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69  ;.    pNew->nWri
1e860 74 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72  teCounter = pStr
1e870 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1e880 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26  er;.    pLvl = &
1e890 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  pNew->aLevel[pSt
1e8a0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
1e8b0 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
1e8c0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1e8d0 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
1e8e0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
1e8f0 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
1e900 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20   if( pLvl->aSeg 
1e910 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
1e920 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69  l, iSeg;.      i
1e930 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a  nt iSegOut = 0;.
1e940 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30        for(iLvl=0
1e950 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
1e960 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1e970 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
1e980 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
1e990 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1e9a0 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
1e9b0 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61           pLvl->a
1e9c0 53 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70  Seg[iSegOut] = p
1e9d0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1e9e0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
1e9f0 0a 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f  .          iSegO
1ea00 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ut++;.        }.
1ea10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
1ea20 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70  ew->nSegment = p
1ea30 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67  Lvl->nSeg = nSeg
1ea40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ea50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ea60 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
1ea70 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 0;.    }.  }
1ea80 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
1ea90 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70      int iLvl = p
1eaa0 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20  New->nLevel-1;. 
1eab0 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1eac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e  =SQLITE_OK && pN
1ead0 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ew->aLevel[iLvl]
1eae0 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20  .nSeg>0 ){.     
1eaf0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35   int nRem = FTS5
1eb00 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  _OPT_WORK_UNIT;.
1eb10 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d        fts5IndexM
1eb20 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e  ergeLevel(p, &pN
1eb30 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29  ew, iLvl, &nRem)
1eb40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
1eb50 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
1eb60 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74  p, pNew);.    ft
1eb70 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1eb80 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  se(pNew);.  }.. 
1eb90 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1eba0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
1ebb0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
1ebc0 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a  exReturn(p); .}.
1ebd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1ebe0 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
1ebf0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
1ec00 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75  rge){.  Fts5Stru
1ec10 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1ec20 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
1ec30 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1ec40 29 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  );.  if( pStruct
1ec50 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
1ec60 76 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49  vel ){.    fts5I
1ec70 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53  ndexMerge(p, &pS
1ec80 74 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a  truct, nMerge);.
1ec90 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1eca0 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
1ecb0 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74  t);.  }.  fts5St
1ecc0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
1ecd0 53 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75  Struct);..  retu
1ece0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
1ecf0 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(p);.}..static
1ed00 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
1ed10 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  tCallback(.  Fts
1ed20 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f  5Index *p, .  vo
1ed30 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20  id *pContext, . 
1ed40 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
1ed50 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
1ed60 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
1ed70 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
1ed80 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
1ed90 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1eda0 70 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35 42  ppendBlob((Fts5B
1edb0 75 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c  uffer*)pContext,
1edc0 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
1edd0 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66  ;.  }.}..typedef
1ede0 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43   struct PoslistC
1edf0 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c 69  allbackCtx Posli
1ee00 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73  stCallbackCtx;.s
1ee10 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c  truct PoslistCal
1ee20 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74 73  lbackCtx {.  Fts
1ee30 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee50 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62  Append to this b
1ee60 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  uffer */.  Fts5C
1ee70 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
1ee80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ee90 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
1eea0 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f  o this column */
1eeb0 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20  .  int eState;  
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20     /* See above 
1eee0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44  */.};../*.** TOD
1eef0 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72  O: Make this mor
1ef00 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a  e efficient!.*/.
1ef10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
1ef20 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46  ndexColsetTest(F
1ef30 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
1ef40 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  et, int iCol){. 
1ef50 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1ef60 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
1ef70 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1ef80 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  ( pColset->aiCol
1ef90 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75  [i]==iCol ) retu
1efa0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1efb0 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
1efc0 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
1efd0 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a  FilterCallback(.
1efe0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1eff0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
1f000 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
1f010 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
1f020 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43  nk.){.  PoslistC
1f030 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78  allbackCtx *pCtx
1f040 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62   = (PoslistCallb
1f050 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  ackCtx*)pContext
1f060 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
1f070 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
1f080 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
1f090 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f    /* Search thro
1f0a0 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ugh to find the 
1f0b0 66 69 72 73 74 20 76 61 72 69 6e 74 20 77 69 74  first varint wit
1f0c0 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20  h value 1. This 
1f0d0 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  is the.    ** st
1f0e0 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
1f0f0 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f  columns hits. */
1f100 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
1f110 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d      int iStart =
1f120 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74   0;..    if( pCt
1f130 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a  x->eState==2 ){.
1f140 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
1f150 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
1f160 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b  tVarint32(pChunk
1f170 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , i, iCol);.    
1f180 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43    if( fts5IndexC
1f190 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
1f1a0 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29  pColset, iCol) )
1f1b0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
1f1c0 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
1f1d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1f1e0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
1f1f0 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20  Ctx->pBuf, 1);. 
1f200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f210 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
1f220 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1f230 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20    }..    do {.  
1f240 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68      while( i<nCh
1f250 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d  unk && pChunk[i]
1f260 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  !=0x01 ){.      
1f270 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b    while( pChunk[
1f280 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b  i] & 0x80 ) i++;
1f290 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
1f2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f2b0 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCtx->eState ){.
1f2c0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f2d0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
1f2e0 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43  (pCtx->pBuf, &pC
1f2f0 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d  hunk[iStart], i-
1f300 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  iStart);.      }
1f310 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68  .      if( i<nCh
1f320 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
1f330 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
1f340 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
1f350 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1f360 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20    if( i>=nChunk 
1f370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
1f380 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20  x->eState = 2;. 
1f390 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f3a0 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74          fts5Fast
1f3b0 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75  GetVarint32(pChu
1f3c0 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20  nk, i, iCol);.  
1f3d0 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
1f3e0 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  tate = fts5Index
1f3f0 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
1f400 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b  >pColset, iCol);
1f410 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1f420 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Ctx->eState ){. 
1f430 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1f440 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1f450 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  lob(pCtx->pBuf, 
1f460 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c  &pChunk[iStart],
1f470 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20   i-iStart);.    
1f480 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
1f490 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   i;.          }.
1f4a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f4b0 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c  }.    }while( i<
1f4c0 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a  nChunk );.  }.}.
1f4d0 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
1f4e0 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
1f4f0 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
1f500 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46  d entry (not EOF
1f510 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
1f520 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20  ion appends the 
1f530 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
1f540 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
1f550 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62  nt entry to.** b
1f560 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64  uffer pBuf. It d
1f570 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63  oes not make a c
1f580 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
1f590 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a  ion-list size.**
1f5a0 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   field..*/.stati
1f5b0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74  c void fts5Segit
1f5c0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
1f5d0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1f5e0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a  5SegIter *pSeg,.
1f5f0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
1f600 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66  olset,.  Fts5Buf
1f610 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69  fer *pBuf.){.  i
1f620 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72  f( 0==fts5Buffer
1f630 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75  Grow(&p->rc, pBu
1f640 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29  f, pSeg->nPos) )
1f650 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
1f660 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  t==0 ){.      ft
1f670 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
1f680 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70  , pSeg, (void*)p
1f690 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Buf, fts5Poslist
1f6a0 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
1f6b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 6f 73 6c  else{.      Posl
1f6c0 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 73  istCallbackCtx s
1f6d0 43 74 78 3b 0a 20 20 20 20 20 20 73 43 74 78 2e  Ctx;.      sCtx.
1f6e0 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20  pBuf = pBuf;.   
1f6f0 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20     sCtx.pColset 
1f700 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20  = pColset;.     
1f710 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d 20 66   sCtx.eState = f
1f720 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
1f730 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a  st(pColset, 0);.
1f740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 43        assert( sC
1f750 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20  tx.eState==0 || 
1f760 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29  sCtx.eState==1 )
1f770 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e  ;.      fts5Chun
1f780 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
1f790 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20  , (void*)&sCtx, 
1f7a0 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
1f7b0 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  rCallback);.    
1f7c0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
1f7d0 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65 72 20  N/OUT parameter 
1f7e0 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74 6f 20  (*pa) points to 
1f7f0 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  a position list 
1f800 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
1f810 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74   If.** the posit
1f820 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
1f830 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f  s entries for co
1f840 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20  lumn iCol, then 
1f850 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a 2a 20  (*pa) is set.** 
1f860 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1f870 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  sub-position-lis
1f880 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d  t for that colum
1f890 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  n and the number
1f8a0 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20   of.** bytes in 
1f8b0 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  it returned. Or,
1f8c0 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
1f8d0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
1f8e0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61  oes not.** conta
1f8f0 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66  in any entries f
1f900 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
1f910 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
1f920 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
1f930 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20 20 63  xExtractCol(.  c
1f940 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20 20 20  onst u8 **pa,   
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f960 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
1f970 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  r to poslist */.
1f980 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66    /* IN: Size of
1f9b0 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1f9c0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
1f9f0 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
1fa00 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20   poslist */.){. 
1fa10 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
1fa20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fa30 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62 65 66   /* Anything bef
1fa40 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 30 78  ore the first 0x
1fa50 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20  01 is col 0 */. 
1fa60 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a   const u8 *p = *
1fa70 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  pa;.  const u8 *
1fa80 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20  pEnd = &p[n];   
1fa90 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74        /* One byt
1faa0 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 6f  e past end of po
1fab0 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
1fac0 20 75 38 20 70 72 65 76 20 3d 20 30 3b 0a 0a 20   u8 prev = 0;.. 
1fad0 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75   while( iCol>iCu
1fae0 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rrent ){.    /* 
1faf0 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20  Advance pointer 
1fb00 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  p until it point
1fb10 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20  s to pEnd or an 
1fb20 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20 69  0x01 byte that i
1fb30 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72  s.    ** not par
1fb40 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f  t of a varint */
1fb50 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 72 65  .    while( (pre
1fb60 76 20 26 20 30 78 38 30 29 20 7c 7c 20 2a 70 21  v & 0x80) || *p!
1fb70 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 70  =0x01 ){.      p
1fb80 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20  rev = *p++;.    
1fb90 20 20 69 66 28 20 70 3d 3d 70 45 6e 64 20 29 20    if( p==pEnd ) 
1fba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1fbb0 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20      *pa = p++;. 
1fbc0 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
1fbd0 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72  arint32(p, iCurr
1fbe0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ent);.  }.  if( 
1fbf0 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20 29  iCol!=iCurrent )
1fc00 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
1fc10 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72   Advance pointer
1fc20 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e   p until it poin
1fc30 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e  ts to pEnd or an
1fc40 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20   0x01 byte that 
1fc50 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74  is.  ** not part
1fc60 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a   of a varint */.
1fc70 20 20 61 73 73 65 72 74 28 20 28 70 72 65 76 20    assert( (prev 
1fc80 26 20 30 78 38 30 29 3d 3d 30 20 29 3b 0a 20 20  & 0x80)==0 );.  
1fc90 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26  while( p<pEnd &&
1fca0 20 28 28 70 72 65 76 20 26 20 30 78 38 30 29 20   ((prev & 0x80) 
1fcb0 7c 7c 20 2a 70 21 3d 30 78 30 31 29 20 29 7b 0a  || *p!=0x01) ){.
1fcc0 20 20 20 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b      prev = *p++;
1fcd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
1fce0 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  - (*pa);.}.../*.
1fcf0 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c  ** Iterator pMul
1fd00 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ti currently poi
1fd10 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
1fd20 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20  ntry (not EOF). 
1fd30 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
1fd40 20 61 70 70 65 6e 64 73 20 74 68 65 20 66 6f 6c   appends the fol
1fd50 6c 6f 77 69 6e 67 20 74 6f 20 62 75 66 66 65 72  lowing to buffer
1fd60 20 70 42 75 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   pBuf:.**.**   *
1fd70 20 54 68 65 20 76 61 72 69 6e 74 20 69 44 65 6c   The varint iDel
1fd80 74 61 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  ta, and.**   * t
1fd90 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
1fda0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
1fdb0 70 6f 69 6e 74 73 20 74 6f 2c 20 69 6e 63 6c 75  points to, inclu
1fdc0 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20 66 69  ding the size fi
1fdd0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  eld..**.** If ar
1fde0 67 75 6d 65 6e 74 20 70 43 6f 6c 73 65 74 20 69  gument pColset i
1fdf0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
1fe00 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69   position list i
1fe10 73 20 66 69 6c 74 65 72 65 64 20 61 63 63 6f 72  s filtered accor
1fe20 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 43 6f 6c 73  ding.** to pCols
1fe30 65 74 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  et before being 
1fe40 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1fe50 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1fe60 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 0a  means there are.
1fe70 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 20 69 6e  ** no entries in
1fe80 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
1fe90 73 74 2c 20 6e 6f 74 68 69 6e 67 20 69 73 20 61  st, nothing is a
1fea0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
1feb0 75 66 66 65 72 20 28 6e 6f 74 0a 2a 2a 20 65 76  uffer (not.** ev
1fec0 65 6e 20 69 44 65 6c 74 61 29 2e 0a 2a 2a 0a 2a  en iDelta)..**.*
1fed0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1fee0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1fef0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
1ff00 2d 3e 72 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ->rc. .*/.static
1ff10 20 69 6e 74 20 66 74 73 35 41 70 70 65 6e 64 50   int fts5AppendP
1ff20 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
1ff30 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44  dex *p,.  i64 iD
1ff40 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 6e 64 65  elta,.  Fts5Inde
1ff50 78 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20  xIter *pMulti,. 
1ff60 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
1ff70 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
1ff80 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
1ff90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ffa0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  OK ){.    Fts5Se
1ffb0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1ffc0 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75  Multi->aSeg[ pMu
1ffd0 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  lti->aFirst[1].i
1ffe0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 61 73 73  First ];.    ass
1fff0 65 72 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74  ert( fts5MultiIt
20000 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29  erEof(p, pMulti)
20010 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20020 74 28 20 70 53 65 67 2d 3e 6e 50 6f 73 3e 30 20  t( pSeg->nPos>0 
20030 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 66 74  );.    if( 0==ft
20040 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
20050 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d  >rc, pBuf, pSeg-
20060 3e 6e 50 6f 73 2b 39 2b 39 29 20 29 7b 0a 0a 20  >nPos+9+9) ){.. 
20070 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69       if( pSeg->i
20080 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
20090 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65  >nPos<=pSeg->pLe
200a0 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20  af->szLeaf .    
200b0 20 20 20 26 26 20 28 70 43 6f 6c 73 65 74 3d 3d     && (pColset==
200c0 30 20 7c 7c 20 70 43 6f 6c 73 65 74 2d 3e 6e 43  0 || pColset->nC
200d0 6f 6c 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a  ol==1).      ){.
200e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38          const u8
200f0 20 2a 70 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e   *pPos = &pSeg->
20100 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69  pLeaf->p[pSeg->i
20110 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
20120 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20       int nPos;. 
20130 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 73         if( pCols
20140 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
20150 6e 50 6f 73 20 3d 20 66 74 73 35 49 6e 64 65 78  nPos = fts5Index
20160 45 78 74 72 61 63 74 43 6f 6c 28 26 70 50 6f 73  ExtractCol(&pPos
20170 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43  , pSeg->nPos, pC
20180 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29  olset->aiCol[0])
20190 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
201a0 6e 50 6f 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  nPos==0 ) return
201b0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
201c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 6f  e{.          nPo
201d0 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  s = pSeg->nPos;.
201e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
201f0 20 20 61 73 73 65 72 74 28 20 6e 50 6f 73 3e 30    assert( nPos>0
20200 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35   );.        fts5
20210 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
20220 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65  Varint(pBuf, iDe
20230 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 66 74  lta);.        ft
20240 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
20250 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 6e  ndVarint(pBuf, n
20260 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20 20 20  Pos*2);.        
20270 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
20280 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
20290 50 6f 73 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20  Pos, nPos);.    
202a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
202b0 20 69 6e 74 20 69 53 76 31 3b 0a 20 20 20 20 20   int iSv1;.     
202c0 20 20 20 69 6e 74 20 69 53 76 32 3b 0a 20 20 20     int iSv2;.   
202d0 20 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a       int iData;.
202e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65  .        /* Appe
202f0 6e 64 20 69 44 65 6c 74 61 20 2a 2f 0a 20 20 20  nd iDelta */.   
20300 20 20 20 20 20 69 53 76 31 20 3d 20 70 42 75 66       iSv1 = pBuf
20310 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ->n;.        fts
20320 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
20330 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44  dVarint(pBuf, iD
20340 65 6c 74 61 29 3b 0a 0a 20 20 20 20 20 20 20 20  elta);..        
20350 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20360 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  IZE */.        i
20370 53 76 32 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20  Sv2 = pBuf->n;. 
20380 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20390 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
203a0 74 28 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50  t(pBuf, pSeg->nP
203b0 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69  os*2);.        i
203c0 44 61 74 61 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a  Data = pBuf->n;.
203d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
203e0 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70  iterPoslist(p, p
203f0 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 70 42  Seg, pColset, pB
20400 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  uf);..        if
20410 28 20 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20  ( pColset ){.   
20420 20 20 20 20 20 20 20 69 6e 74 20 6e 41 63 74 75         int nActu
20430 61 6c 20 3d 20 70 42 75 66 2d 3e 6e 20 2d 20 69  al = pBuf->n - i
20440 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  Data;.          
20450 69 66 28 20 6e 41 63 74 75 61 6c 21 3d 70 53 65  if( nActual!=pSe
20460 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20  g->nPos ){.     
20470 20 20 20 20 20 20 20 69 66 28 20 6e 41 63 74 75         if( nActu
20480 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  al==0 ){.       
20490 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d         pBuf->n =
204a0 20 69 53 76 31 3b 0a 20 20 20 20 20 20 20 20 20   iSv1;.         
204b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
204c0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
204d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
204e0 69 6e 74 20 6e 52 65 71 20 3d 20 73 71 6c 69 74  int nReq = sqlit
204f0 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c  e3Fts5GetVarintL
20500 65 6e 28 28 75 33 32 29 28 6e 41 63 74 75 61 6c  en((u32)(nActual
20510 2a 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *2));.          
20520 20 20 20 20 77 68 69 6c 65 28 20 69 53 76 32 3c      while( iSv2<
20530 28 69 44 61 74 61 2d 6e 52 65 71 29 20 29 7b 20  (iData-nReq) ){ 
20540 70 42 75 66 2d 3e 70 5b 69 53 76 32 2b 2b 5d 20  pBuf->p[iSv2++] 
20550 3d 20 30 78 38 30 3b 20 7d 0a 20 20 20 20 20 20  = 0x80; }.      
20560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
20570 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
20580 75 66 2d 3e 70 5b 69 53 76 32 5d 2c 20 6e 41 63  uf->p[iSv2], nAc
20590 74 75 61 6c 2a 32 29 3b 0a 20 20 20 20 20 20 20  tual*2);.       
205a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
205b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
205c0 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a     }..    }.  }.
205d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
205e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
205f0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
20600 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
20610 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70  *pIter){.  u8 *p
20620 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69   = pIter->aPosli
20630 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a  st + pIter->nSiz
20640 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c  e + pIter->nPosl
20650 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ist;..  assert( 
20660 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
20670 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65  );.  if( p>=pIte
20680 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70  r->aEof ){.    p
20690 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
206a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
206b0 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
206c0 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61    p += fts5GetVa
206d0 72 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69  rint(p, (u64*)&i
206e0 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
206f0 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
20700 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  lta;..    /* Rea
20710 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  d position list 
20720 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  size */.    if( 
20730 70 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20  p[0] & 0x80 ){. 
20740 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20       int nPos;. 
20750 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a       pIter->nSiz
20760 65 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  e = fts5GetVarin
20770 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20  t32(p, nPos);.  
20780 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c      pIter->nPosl
20790 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b  ist = (nPos>>1);
207a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
207b0 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73    pIter->nPoslis
207c0 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29  t = ((int)(p[0])
207d0 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49  ) >> 1;.      pI
207e0 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a  ter->nSize = 1;.
207f0 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72      }..    pIter
20800 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a  ->aPoslist = p;.
20810 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
20820 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
20830 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75  erInit(.  Fts5Bu
20840 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46  ffer *pBuf, .  F
20850 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
20860 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65  pIter.){.  memse
20870 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
20880 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
20890 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
208a0 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65   pBuf->p;.  pIte
208b0 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d  r->aEof = &pBuf-
208c0 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66  >p[pBuf->n];.  f
208d0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
208e0 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69  xt(pIter);.}..#i
208f0 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  f 0./*.** Append
20900 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75   a doclist to bu
20910 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
20920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
20930 73 73 75 6d 65 73 20 74 68 61 74 20 73 70 61 63  ssumes that spac
20940 65 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66  e within the buf
20950 66 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  fer has already 
20960 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  been.** allocate
20970 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
20980 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  d fts5MergeAppen
20990 64 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75  dDocid(.  Fts5Bu
209a0 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20  ffer *pBuf,     
209b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
209c0 66 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20  fer to write to 
209d0 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74  */.  i64 *piLast
209e0 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
209f0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
20a00 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77  Previous rowid w
20a10 72 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20  ritten (if any) 
20a20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20  */.  i64 iRowid 
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f       /* Rowid to
20a50 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20   append */.){.  
20a60 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21  assert( pBuf->n!
20a70 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f  =0 || (*piLastRo
20a80 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73  wid)==0 );.  fts
20a90 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
20aa0 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52  dVarint(pBuf, iR
20ab0 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f  owid - *piLastRo
20ac0 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52  wid);.  *piLastR
20ad0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d  owid = iRowid;.}
20ae0 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
20af0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
20b00 44 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73  Docid(pBuf, iLas
20b10 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20  tRowid, iRowid) 
20b20 7b 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65  {       \.  asse
20b30 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30  rt( (pBuf)->n!=0
20b40 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29   || (iLastRowid)
20b50 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
20b60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73           \.  fts
20b70 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
20b80 64 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20  dVarint((pBuf), 
20b90 28 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73  (iRowid) - (iLas
20ba0 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69  tRowid)); \.  (i
20bb0 4c 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52  LastRowid) = (iR
20bc0 6f 77 69 64 29 3b 20 20 20 20 20 20 20 20 20 20  owid);          
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
20bf0 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31  /*.** Buffers p1
20c00 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20   and p2 contain 
20c10 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66  doclists. This f
20c20 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74  unction merges t
20c30 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66  he content.** of
20c40 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74   the two doclist
20c50 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73  s together and s
20c60 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74 6f  ets buffer p1 to
20c70 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f   the result befo
20c80 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
20c90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
20ca0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
20cb0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
20cc0 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e   in p->rc. If an
20cd0 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c   error has.** al
20ce0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
20cf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
20d00 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
20d10 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
20d20 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20  gePrefixLists(. 
20d30 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
20d60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
20d70 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20  5Buffer *p1,    
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d90 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65  First list to me
20da0 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  rge */.  Fts5Buf
20db0 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20  fer *p2         
20dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
20dd0 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  nd list to merge
20de0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d   */.){.  if( p2-
20df0 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c  >n ){.    i64 iL
20e00 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
20e10 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
20e20 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f  r i1;.    Fts5Do
20e30 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20  clistIter i2;.  
20e40 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
20e50 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
20e60 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74   tmp;.    memset
20e70 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (&out, 0, sizeof
20e80 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73  (out));.    mems
20e90 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65  et(&tmp, 0, size
20ea0 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66  of(tmp));..    f
20eb0 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
20ec0 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e  ->rc, &out, p1->
20ed0 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 20 20  n + p2->n);.    
20ee0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
20ef0 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20 20  nit(p1, &i1);.  
20f00 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
20f10 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b 0a  rInit(p2, &i2);.
20f20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
20f30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
20f40 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c  i1.aPoslist!=0 |
20f50 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30  | i2.aPoslist!=0
20f60 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
20f70 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  2.aPoslist==0 ||
20f80 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 20 26 26   (i1.aPoslist &&
20f90 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52   i1.iRowid<i2.iR
20fa0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20  owid) ){.       
20fb0 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
20fc0 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
20fd0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
20fe0 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
20ff0 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
21000 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
21010 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
21020 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
21030 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
21040 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a  list+i1.nSize);.
21050 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
21060 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
21070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21080 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50 6f 73  else if( i1.aPos
21090 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52  list==0 || i2.iR
210a0 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20  owid!=i1.iRowid 
210b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
210c0 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32  py entry from i2
210d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
210e0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
210f0 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
21100 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i2.iRowid);. 
21110 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
21120 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
21130 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73  &out, i2.aPoslis
21140 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69  t, i2.nPoslist+i
21150 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  2.nSize);.      
21160 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
21170 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20  rNext(&i2);.    
21180 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a    }.      else{.
21190 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73          i64 iPos
211a0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  1 = 0;.        i
211b0 36 34 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20  64 iPos2 = 0;.  
211c0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20        int iOff1 
211d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
211e0 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20 20   iOff2 = 0;.    
211f0 20 20 20 20 75 38 20 2a 61 31 20 3d 20 26 69 31      u8 *a1 = &i1
21200 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69  .aPoslist[i1.nSi
21210 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  ze];.        u8 
21220 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69  *a2 = &i2.aPosli
21230 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20  st[i2.nSize];.. 
21240 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
21250 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  stWriter writer;
21260 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
21270 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
21280 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20  of(writer));..  
21290 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74        /* Merge t
212a0 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20  he two position 
212b0 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20  lists. */ .     
212c0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
212d0 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
212e0 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
212f0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
21300 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d  s5BufferZero(&tm
21310 70 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c  p);..        sql
21320 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
21330 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
21340 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
21350 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
21360 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
21370 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e  stNext64(a2, i2.
21380 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32  nPoslist, &iOff2
21390 2c 20 26 69 50 6f 73 32 29 3b 0a 0a 20 20 20 20  , &iPos2);..    
213a0 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
213b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
213c0 69 50 6f 73 31 3e 3d 30 20 7c 7c 20 69 50 6f 73  iPos1>=0 || iPos
213d0 32 3e 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  2>=0) ){.       
213e0 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20     i64 iNew;.   
213f0 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 32         if( iPos2
21400 3c 30 20 7c 7c 20 28 69 50 6f 73 31 3e 3d 30 20  <0 || (iPos1>=0 
21410 26 26 20 69 50 6f 73 31 3c 69 50 6f 73 32 29 20  && iPos1<iPos2) 
21420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
21430 4e 65 77 20 3d 20 69 50 6f 73 31 3b 0a 20 20 20  New = iPos1;.   
21440 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21450 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
21460 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  4(a1, i1.nPoslis
21470 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73  t, &iOff1, &iPos
21480 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  1);.          }e
21490 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
214a0 20 69 4e 65 77 20 3d 20 69 50 6f 73 32 3b 0a 20   iNew = iPos2;. 
214b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
214c0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
214d0 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
214e0 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
214f0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
21500 20 20 69 66 28 20 69 50 6f 73 31 3d 3d 69 50 6f    if( iPos1==iPo
21510 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s2 ){.          
21520 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
21530 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c  oslistNext64(a1,
21540 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i1.nPoslist, &i
21550 4f 66 66 31 2c 26 69 50 6f 73 31 29 3b 0a 20 20  Off1,&iPos1);.  
21560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21580 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
21590 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74  3Fts5PoslistWrit
215a0 65 72 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  erAppend(&tmp, &
215b0 77 72 69 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20  writer, iNew);. 
215c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
215d0 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
215e0 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
215f0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
21600 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
21610 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20  , tmp.n * 2);.  
21620 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21630 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
21640 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e  out, tmp.p, tmp.
21650 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
21660 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
21670 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
21680 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
21690 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i2);.      }.
216a0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
216b0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
216c0 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e   p1, out.n, out.
216d0 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
216e0 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20  erFree(&tmp);.  
216f0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
21700 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  (&out);.  }.}..s
21710 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
21720 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75  ufferSwap(Fts5Bu
21730 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75  ffer *p1, Fts5Bu
21740 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73  ffer *p2){.  Fts
21750 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70  5Buffer tmp = *p
21760 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a  1;.  *p1 = *p2;.
21770 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a    *p2 = tmp;.}..
21780 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
21790 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
217a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72     /* Index to r
217d0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
217e0 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21800 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52   True for "ORDER
21810 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
21820 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
21830 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
21840 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
21850 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
21860 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
21870 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21890 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
218a0 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
218b0 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
218c0 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
218d0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
218e0 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 65  t matches to the
218f0 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  se columns */.  
21900 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
21910 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
21920 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
21930 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ator */.){.  Fts
21940 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
21950 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  uct;.  Fts5Buffe
21960 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74  r *aBuf;.  const
21970 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a   int nBuf = 32;.
21980 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35 42  .  aBuf = (Fts5B
21990 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61  uffer*)fts5IdxMa
219a0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
219b0 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29  ts5Buffer)*nBuf)
219c0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
219d0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
219e0 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20  p);..  if( aBuf 
219f0 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  && pStruct ){.  
21a00 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
21a10 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
21a20 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20 20 69 6e  ERY_SCAN;.    in
21a30 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61  t i;.    i64 iLa
21a40 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
21a50 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
21a60 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49  p1 = 0;     /* I
21a70 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20  terator used to 
21a80 67 61 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d  gather data from
21a90 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74   index */.    Ft
21aa0 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
21ab0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f     Fts5Buffer do
21ac0 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 62  clist;.    int b
21ad0 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 6d 65  NewTerm;..    me
21ae0 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30  mset(&doclist, 0
21af0 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74  , sizeof(doclist
21b00 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  ));.    for(fts5
21b10 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
21b20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67  pStruct, 1, flag
21b30 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  s, pToken, nToke
21b40 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a  n, -1, 0, &p1);.
21b50 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
21b60 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d  iIterEof(p, p1)=
21b70 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
21b80 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70  MultiIterNext2(p
21b90 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29  , p1, &bNewTerm)
21ba0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36  .    ){.      i6
21bb0 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
21bc0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 31  ultiIterRowid(p1
21bd0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  );.      int nTe
21be0 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  rm;.      const 
21bf0 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35  u8 *pTerm = fts5
21c00 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31  MultiIterTerm(p1
21c10 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &nTerm);.     
21c20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63   assert_nc( memc
21c30 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
21c40 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
21c50 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
21c60 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
21c70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
21c80 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65  erm<nToken || me
21c90 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
21ca0 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72  rm, nToken) ) br
21cb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
21cc0 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
21cd0 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  n>0 && iRowid<=i
21ce0 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  LastRowid ){.   
21cf0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
21d00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
21d10 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b  & doclist.n; i++
21d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
21d30 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
21d40 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
21d50 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
21d60 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
21d70 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
21d80 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
21d90 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
21da0 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
21db0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
21dc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21dd0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
21de0 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74  ists(p, &doclist
21df0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
21e00 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
21e10 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
21e20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21e40 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
21e50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21e60 69 66 28 20 21 66 74 73 35 41 70 70 65 6e 64 50  if( !fts5AppendP
21e70 6f 73 6c 69 73 74 28 70 2c 20 69 52 6f 77 69 64  oslist(p, iRowid
21e80 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c  -iLastRowid, p1,
21e90 20 70 43 6f 6c 73 65 74 2c 20 26 64 6f 63 6c 69   pColset, &docli
21ea0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  st) ){.        i
21eb0 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
21ec0 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  id;.      }.    
21ed0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
21ee0 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
21ef0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
21f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21f10 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65      fts5MergePre
21f20 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f 63  fixLists(p, &doc
21f30 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
21f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
21f50 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61  ts5BufferFree(&a
21f60 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Buf[i]);.    }. 
21f70 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
21f80 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20  Free(p, p1);..  
21f90 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49 64    pData = fts5Id
21fa0 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
21fb0 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f  f(Fts5Data) + do
21fc0 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66  clist.n);.    if
21fd0 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
21fe0 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a   pData->p = (u8*
21ff0 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20  )&pData[1];.    
22000 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44    pData->nn = pD
22010 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f  ata->szLeaf = do
22020 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d  clist.n;.      m
22030 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20  emcpy(pData->p, 
22040 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69  doclist.p, docli
22050 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  st.n);.      fts
22060 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70  5MultiIterNew2(p
22070 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20  , pData, bDesc, 
22080 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  ppIter);.    }. 
22090 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
220a0 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d  e(&doclist);.  }
220b0 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
220c0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
220d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
220e0 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  e(aBuf);.}.../*.
220f0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
22100 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
22110 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
22120 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29  Fts5IndexWrite()
22130 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74   pertain.** to t
22140 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
22150 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a   rowid iRowid..*
22160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
22170 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65  5IndexBeginWrite
22180 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
22190 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20  nt bDelete, i64 
221a0 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72  iRowid){.  asser
221b0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
221c0 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _OK );..  /* All
221d0 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74  ocate the hash t
221e0 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e  able if it has n
221f0 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
22200 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
22210 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29  f( p->pHash==0 )
22220 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
22230 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77  lite3Fts5HashNew
22240 28 26 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e  (&p->pHash, &p->
22250 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20  nPendingData);. 
22260 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
22270 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
22280 20 64 69 73 6b 20 69 66 20 72 65 71 75 69 72 65   disk if require
22290 64 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69  d */.  if( iRowi
222a0 64 3c 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64  d<p->iWriteRowid
222b0 20 0a 20 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d   .   || (iRowid=
222c0 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20  =p->iWriteRowid 
222d0 26 26 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30  && p->bDelete==0
222e0 29 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e  ).   || (p->nPen
222f0 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d  dingData > p->nM
22300 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20 0a  axPendingData) .
22310 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64    ){.    fts5Ind
22320 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a  exFlush(p);.  }.
22330 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  .  p->iWriteRowi
22340 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d  d = iRowid;.  p-
22350 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65  >bDelete = bDele
22360 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  te;.  return fts
22370 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
22380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
22390 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a   data to disk..*
223a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
223b0 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49  5IndexSync(Fts5I
223c0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f  ndex *p, int bCo
223d0 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  mmit){.  assert(
223e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
223f0 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
22400 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20  Flush(p);.  if( 
22410 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c  bCommit ) fts5Cl
22420 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
22430 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
22440 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
22450 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
22460 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
22470 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
22480 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
22490 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
224a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
224b0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
224c0 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
224d0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
224e0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
224f0 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
22500 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
22510 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
22520 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
22530 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
22540 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
22550 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22560 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
22570 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
22580 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
22590 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
225a0 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65 72  Data(p);.  asser
225b0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
225c0 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _OK );.  return 
225d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
225e0 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
225f0 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  able is complete
22600 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68  ly empty when th
22610 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22620 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  alled. This.** f
22630 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65  unction populate
22640 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69 6e  s it with the in
22650 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65 20  itial structure 
22660 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
22670 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74   index,.** and t
22680 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69  he initial versi
22690 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72 61  on of the "avera
226a0 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a  ges" record (a z
226b0 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a  ero-byte blob)..
226c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
226d0 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74  s5IndexReinit(Ft
226e0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
226f0 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a  ts5Structure s;.
22700 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
22710 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
22720 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61  ture));.  fts5Da
22730 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
22740 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20  AVERAGES_ROWID, 
22750 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30  (const u8*)"", 0
22760 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
22770 72 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a  reWrite(p, &s);.
22780 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
22790 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
227a0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
227b0 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
227c0 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74  e. If the bCreat
227d0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  e argument is tr
227e0 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e  ue, create.** an
227f0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
22800 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61   underlying %_da
22810 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
22820 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
22830 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
22840 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
22850 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
22860 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72  ITE_OK..** Other
22870 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f  wise, set *pp to
22880 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e   NULL and return
22890 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
228a0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
228b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
228c0 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  en(.  Fts5Config
228d0 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e   *pConfig, .  in
228e0 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74  t bCreate, .  Ft
228f0 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20  s5Index **pp,.  
22900 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
22910 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22920 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65  E_OK;.  Fts5Inde
22930 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
22940 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
22950 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20  bject */..  *pp 
22960 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78  = p = (Fts5Index
22970 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
22980 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a  locZero(&rc, siz
22990 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b  eof(Fts5Index));
229a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
229b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70  E_OK ){.    p->p
229c0 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67  Config = pConfig
229d0 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e  ;.    p->nWorkUn
229e0 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55  it = FTS5_WORK_U
229f0 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78  NIT;.    p->nMax
22a00 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30  PendingData = 10
22a10 32 34 2a 31 30 32 34 3b 0a 20 20 20 20 70 2d 3e  24*1024;.    p->
22a20 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74  zDataTbl = sqlit
22a30 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72  e3Fts5Mprintf(&r
22a40 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43  c, "%s_data", pC
22a50 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  onfig->zName);. 
22a60 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54     if( p->zDataT
22a70 62 6c 20 26 26 20 62 43 72 65 61 74 65 20 29 7b  bl && bCreate ){
22a80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22a90 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
22aa0 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 43  le(.          pC
22ab0 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22  onfig, "data", "
22ac0 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
22ad0 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c  RY KEY, block BL
22ae0 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20  OB", 0, pzErr.  
22af0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
22b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22b10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
22b20 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
22b30 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22  Table(pConfig, "
22b40 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20  idx", .         
22b50 20 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c     "segid, term,
22b60 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b   pgno, PRIMARY K
22b70 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22  EY(segid, term)"
22b80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 31  , .            1
22b90 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20  , pzErr.        
22ba0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22bb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
22bd0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
22be0 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20  dexReinit(p);.  
22bf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22c00 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
22c10 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
22c20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
22c30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22c40 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22c50 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70  Close(p);.    *p
22c60 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  p = 0;.  }.  ret
22c70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22c80 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   Close a handle 
22c90 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
22ca0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
22cb0 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
22cc0 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
22cd0 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
22ce0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
22cf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22d00 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29  TE_OK;.  if( p )
22d10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
22d20 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20  >pReader==0 );. 
22d30 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
22d40 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  ize(p->pWriter);
22d50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
22d60 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65  alize(p->pDelete
22d70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
22d80 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
22d90 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  Writer);.    sql
22da0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
22db0 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
22dc0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
22dd0 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  ize(p->pIdxSelec
22de0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  t);.    sqlite3F
22df0 74 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e 70  ts5HashFree(p->p
22e00 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Hash);.    sqlit
22e10 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61  e3_free(p->zData
22e20 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tbl);.    sqlite
22e30 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
22e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22e50 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
22e60 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
22e70 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74  er containing ut
22e80 66 2d 38 20 74 65 78 74 20 74 68 61 74 20 69 73  f-8 text that is
22e90 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20   n bytes in .** 
22ea0 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65  size. Return the
22eb0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22ec0 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68   in the nChar ch
22ed0 61 72 61 63 74 65 72 20 70 72 65 66 69 78 20 6f  aracter prefix o
22ee0 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c  f the.** buffer,
22ef0 20 6f 72 20 30 20 69 66 20 74 68 65 72 65 20 61   or 0 if there a
22f00 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68  re less than nCh
22f10 61 72 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ar characters in
22f20 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69   total..*/.stati
22f30 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43  c int fts5IndexC
22f40 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28  harlenToBytelen(
22f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 69  const char *p, i
22f60 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 6e 43  nt nByte, int nC
22f70 68 61 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  har){.  int n = 
22f80 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
22f90 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20  r(i=0; i<nChar; 
22fa0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e  i++){.    if( n>
22fb0 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20  =nByte ) return 
22fc0 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74  0;      /* Input
22fd0 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
22fe0 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73  than nChar chars
22ff0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73   */.    if( (uns
23000 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b  igned char)p[n++
23010 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
23020 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20   while( (p[n] & 
23030 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b  0xc0)==0x80 ) n+
23040 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
23050 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
23060 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38  * pIn is a UTF-8
23070 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c   encoded string,
23080 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69   nIn bytes in si
23090 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
230a0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63  umber of.** unic
230b0 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ode characters i
230c0 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  n the string..*/
230d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
230e0 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e  IndexCharlen(con
230f0 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e  st char *pIn, in
23100 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43  t nIn){.  int nC
23110 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  har = 0;        
23120 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30      .  int i = 0
23130 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e  ;.  while( i<nIn
23140 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73   ){.    if( (uns
23150 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69  igned char)pIn[i
23160 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
23170 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20     while( i<nIn 
23180 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63  && (pIn[i] & 0xc
23190 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a  0)==0x80 ) i++;.
231a0 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b      }.    nChar+
231b0 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
231c0 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nChar;.}../*.** 
231d0 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65  Insert or remove
231e0 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d   data to or from
231f0 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68   the index. Each
23200 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74   time a document
23210 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f   is .** added to
23220 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
23230 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73   the index, this
23240 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
23250 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  led one or more.
23260 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** times..**.** 
23270 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69  For an insert, i
23280 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
23290 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
232a0 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20  oken in the new 
232b0 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20  document..** If 
232c0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
232d0 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75   a delete, it mu
232e0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74  st be called (at
232f0 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72   least) once for
23300 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20   each.** unique 
23310 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63  token in the doc
23320 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43  ument with an iC
23330 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68  ol value less th
23340 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f  an zero. The iPo
23350 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  s.** argument is
23360 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64   ignored for a d
23370 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  elete..*/.int sq
23380 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72  lite3Fts5IndexWr
23390 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ite(.  Fts5Index
233a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
233b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
233c0 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
233d0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e   /* Column token
23400 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65   appears in (-ve
23410 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20   -> delete) */. 
23420 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20   int iPos,      
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
23450 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c  token within col
23460 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
23470 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74  har *pToken, int
23480 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65   nToken  /* Toke
23490 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f  n to add or remo
234a0 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e  ve to or from in
234b0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  dex */.){.  int 
234c0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
234d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
234e0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
234f0 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
23500 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
23510 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
23520 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
23530 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
23540 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
23550 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73  >pConfig;..  ass
23560 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
23570 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
23580 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e  t( (iCol<0)==p->
23590 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a  bDelete );..  /*
235a0 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
235b0 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  o the main terms
235c0 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20   index. */.  rc 
235d0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
235e0 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d  hWrite(.      p-
235f0 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74  >pHash, p->iWrit
23600 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
23610 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
23620 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  EFIX, pToken, nT
23630 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72  oken.  );..  for
23640 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
23650 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d  >nPrefix && rc==
23660 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
23670 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
23680 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
23690 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
236a0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66  n, nToken, pConf
236b0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b  ig->aPrefix[i]);
236c0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
236d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
236e0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
236f0 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
23700 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
23710 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
23720 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  s, FTS5_MAIN_PRE
23730 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c  FIX+i+1, pToken,
23740 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a   nByte.      );.
23750 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
23760 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23770 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72   Open a new iter
23780 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  ator to iterate 
23790 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64  though all rowid
237a0 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
237b0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f  .** specified to
237c0 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65  ken or token pre
237d0 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fix..*/.int sqli
237e0 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
237f0 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  y(.  Fts5Index *
23800 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23810 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
23820 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  x to query */.  
23830 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
23840 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  en, int nToken, 
23850 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65  /* Token (or pre
23860 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f  fix) to query fo
23870 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
23880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23890 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
238a0 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  f FTS5INDEX_QUER
238b0 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  Y_X flags */.  F
238c0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
238d0 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
238e0 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f  * Match these co
238f0 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20  lumns only */.  
23900 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
23910 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
23920 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
23930 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ator object */.)
23940 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
23950 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
23960 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64 65  nfig;.  Fts5Inde
23970 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b  xIter *pRet = 0;
23980 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
23990 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
239a0 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  f = {0, 0, 0};..
239b0 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52    /* If the QUER
239c0 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73  Y_SCAN flag is s
239d0 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  et, all other fl
239e0 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61  ags must be clea
239f0 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  r. */.  assert( 
23a00 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
23a10 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d  EX_QUERY_SCAN)==
23a20 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35  0 || flags==FTS5
23a30 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
23a40 20 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 42   );..  if( fts5B
23a50 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
23a60 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31  , &buf, nToken+1
23a70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
23a80 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54  py(&buf.p[1], pT
23a90 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a  oken, nToken);..
23aa0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
23ab0 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  BUG.    /* If th
23ac0 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  e QUERY_TEST_NOI
23ad0 44 58 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  DX flag was spec
23ae0 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69 73  ified, then this
23af0 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20 2a   must be a.    *
23b00 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e 20  * prefix-query. 
23b10 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67  Instead of using
23b20 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78 20   a prefix-index 
23b30 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29 2c  (if one exists),
23b40 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61 74   .    ** evaluat
23b50 65 20 74 68 65 20 70 72 65 66 69 78 20 71 75 65  e the prefix que
23b60 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69  ry using the mai
23b70 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68 69  n FTS index. Thi
23b80 73 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a 2a  s is used.    **
23b90 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73 61   for internal sa
23ba0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62 79  nity checking by
23bb0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
23bc0 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a 20  heck in debug . 
23bd0 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e     ** mode only.
23be0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 6f    */.    if( pCo
23bf0 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64  nfig->bPrefixInd
23c00 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  ex==0 || (flags 
23c10 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
23c20 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b  Y_TEST_NOIDX) ){
23c30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
23c40 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
23c50 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b  _QUERY_PREFIX );
23c60 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b  .      iIdx = 1+
23c70 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
23c80 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
23c90 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  if.    if( flags
23ca0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
23cb0 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  RY_PREFIX ){.   
23cc0 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66     int nChar = f
23cd0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
23ce0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
23cf0 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d  .      for(iIdx=
23d00 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  1; iIdx<=pConfig
23d10 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
23d20 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
23d30 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
23d40 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20  [iIdx-1]==nChar 
23d50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
23d60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23d70 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
23d80 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
23d90 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
23da0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
23db0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
23dc0 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
23dd0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
23de0 20 2b 20 69 49 64 78 3b 0a 20 20 20 20 20 20 69   + iIdx;.      i
23df0 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
23e00 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
23e10 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
23e20 74 2c 20 31 2c 20 66 6c 61 67 73 2c 20 62 75 66  t, 1, flags, buf
23e30 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31  .p, nToken+1, -1
23e40 2c 20 30 2c 20 26 70 52 65 74 29 3b 0a 20 20 20  , 0, &pRet);.   
23e50 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
23e60 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
23e70 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
23e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
23e90 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20   bDesc = (flags 
23ea0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
23eb0 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20  Y_DESC)!=0;.    
23ec0 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53    buf.p[0] = FTS
23ed0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20  5_MAIN_PREFIX;. 
23ee0 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72       fts5SetupPr
23ef0 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73  efixIter(p, bDes
23f00 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  c, buf.p, nToken
23f10 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52  +1, pColset, &pR
23f20 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  et);.    }..    
23f30 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
23f40 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74     sqlite3Fts5It
23f50 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a 20  erClose(pRet);. 
23f60 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
23f70 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65       fts5CloseRe
23f80 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20  ader(p);.    }. 
23f90 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 52 65     *ppIter = pRe
23fa0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  t;.    sqlite3Ft
23fb0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
23fc0 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
23fd0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
23fe0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
23ff0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
24000 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
24010 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
24020 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e  ument is at EOF.
24030 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
24040 74 73 35 49 74 65 72 45 6f 66 28 46 74 73 35 49  ts5IterEof(Fts5I
24050 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
24060 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
24070 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
24080 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
24090 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66  turn pIter->bEof
240a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
240b0 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
240c0 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a  hing rowid. .*/.
240d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
240e0 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
240f0 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
24100 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
24110 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
24120 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d  TE_OK );.  fts5M
24130 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74  ultiIterNext(pIt
24140 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
24150 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  r, 0, 0);.  retu
24160 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24170 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
24180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
24190 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
241a0 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64  ching term/rowid
241b0 2e 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74  . Used by the ft
241c0 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a  s5vocab module..
241d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
241e0 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46  s5IterNextScan(F
241f0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
24200 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter){.  Fts5Inde
24210 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
24220 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  ndex;..  assert(
24230 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
24240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
24250 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
24260 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
24270 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  0, 0);.  if( p->
24280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24290 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
242a0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
242b0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
242c0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
242d0 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
242e0 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74  pLeaf && pSeg->t
242f0 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d  erm.p[0]!=FTS5_M
24300 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  AIN_PREFIX ){.  
24310 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
24320 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29  ase(pSeg->pLeaf)
24330 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c  ;.      pSeg->pL
24340 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
24350 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
24360 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
24370 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
24380 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
24390 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
243a0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
243b0 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61  tching rowid tha
243c0 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61  t occurs at or a
243d0 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65  fter iMatch. The
243e0 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  .** definition o
243f0 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20  f "at or after" 
24400 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
24410 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  er this iterator
24420 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20   iterates.** in 
24430 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73  ascending or des
24440 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
24450 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
24460 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
24470 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  rom(Fts5IndexIte
24480 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d  r *pIter, i64 iM
24490 61 74 63 68 29 7b 0a 20 20 66 74 73 35 4d 75 6c  atch){.  fts5Mul
244a0 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
244b0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
244c0 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  ter, iMatch);.  
244d0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
244e0 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
244f0 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
24500 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
24510 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34  nt rowid..*/.i64
24520 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
24530 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 49  Rowid(Fts5IndexI
24540 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
24550 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49  eturn fts5MultiI
24560 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
24570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24580 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
24590 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  m..*/.const char
245a0 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65   *sqlite3Fts5Ite
245b0 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49  rTerm(Fts5IndexI
245c0 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
245d0 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  *pn){.  int n;. 
245e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
245f0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74   (const char*)ft
24600 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
24610 70 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70  pIter, &n);.  *p
24620 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72  n = n-1;.  retur
24630 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74 61  n &z[1];.}...sta
24640 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
24650 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 20 28  xExtractColset (
24660 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
24670 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
24680 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20     /* Colset to 
24690 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63  filter on */.  c
246a0 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c 20 69  onst u8 *pPos, i
246b0 6e 74 20 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f  nt nPos,       /
246c0 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * Position list 
246d0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
246e0 2a 70 42 75 66 20 20 20 20 20 20 20 20 20 20 20  *pBuf           
246f0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
24700 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  uffer */.){.  in
24710 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24720 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 74  ;.  int i;..  ft
24730 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
24740 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  f);.  for(i=0; i
24750 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20  <pColset->nCol; 
24760 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
24770 75 38 20 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b  u8 *pSub = pPos;
24780 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  .    int nSub = 
24790 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
247a0 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73 2c  Col(&pSub, nPos,
247b0 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b   pColset->aiCol[
247c0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75  i]);.    if( nSu
247d0 62 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42  b ){.      fts5B
247e0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
247f0 26 72 63 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c  &rc, pBuf, nSub,
24800 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pSub);.    }.  
24810 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24820 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
24830 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
24840 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
24850 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
24860 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
24870 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
24880 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61  entry. Output va
24890 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65  riable *pn is se
248a0 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
248b0 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
248c0 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65 20  in bytes before 
248d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
248e0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
248f0 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73  sition list does
24900 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
24910 20 22 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65   "number of byte
24920 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65  s" varint.** fie
24930 6c 64 20 74 68 61 74 20 73 74 61 72 74 73 20 74  ld that starts t
24940 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
24950 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   on disk..*/.int
24960 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
24970 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
24980 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
24990 20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a   .  Fts5Colset *
249a0 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
249b0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 69      /* Column fi
249c0 6c 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  lter (or NULL) *
249d0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  /.  const u8 **p
249e0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
249f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
24a00 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d  ter to position-
24a10 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 69  list data */.  i
24a20 6e 74 20 2a 70 6e 2c 20 20 20 20 20 20 20 20 20  nt *pn,         
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a40 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70  * OUT: Size of p
24a50 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e 20  osition-list in 
24a60 62 79 74 65 73 20 2a 2f 0a 20 20 69 36 34 20 2a  bytes */.  i64 *
24a70 70 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  piRowid         
24a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24a90 54 3a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64  T: Current rowid
24aa0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65 67   */.){.  Fts5Seg
24ab0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
24ac0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
24ad0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
24ae0 73 74 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  st ];.  assert( 
24af0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
24b00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
24b10 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 70 53 65    *piRowid = pSe
24b20 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28  g->iRowid;.  if(
24b30 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
24b40 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70  et+pSeg->nPos<=p
24b50 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  Seg->pLeaf->szLe
24b60 61 66 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 50  af ){.    u8 *pP
24b70 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  os = &pSeg->pLea
24b80 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
24b90 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28  Offset];.    if(
24ba0 20 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20 70   pColset==0 || p
24bb0 49 74 65 72 2d 3e 62 46 69 6c 74 65 72 65 64 20  Iter->bFiltered 
24bc0 29 7b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70  ){.      *pn = p
24bd0 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 20  Seg->nPos;.     
24be0 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20 20   *pp = pPos;.   
24bf0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 73   }else if( pCols
24c00 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20  et->nCol==1 ){. 
24c10 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b       *pp = pPos;
24c20 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 66 74 73  .      *pn = fts
24c30 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
24c40 28 70 70 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  (pp, pSeg->nPos,
24c50 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b   pColset->aiCol[
24c60 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
24c70 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
24c80 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
24c90 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73  list);.      fts
24ca0 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
24cb0 73 65 74 28 70 43 6f 6c 73 65 74 2c 20 70 50 6f  set(pColset, pPo
24cc0 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 26  s, pSeg->nPos, &
24cd0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
24ce0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 49 74  .      *pp = pIt
24cf0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
24d00 20 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72       *pn = pIter
24d10 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20  ->poslist.n;.   
24d20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
24d30 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
24d40 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
24d50 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72  .    fts5Segiter
24d60 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70  Poslist(pIter->p
24d70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43 6f  Index, pSeg, pCo
24d80 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f  lset, &pIter->po
24d90 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 70 20  slist);.    *pp 
24da0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
24db0 2e 70 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49  .p;.    *pn = pI
24dc0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ter->poslist.n;.
24dd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
24de0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
24df0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
24e00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24e10 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
24e20 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  o sqlite3Fts5Ite
24e30 72 50 6f 73 6c 69 73 74 28 29 2c 20 65 78 63 65  rPoslist(), exce
24e40 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 63 6f  pt that it.** co
24e50 70 69 65 73 20 74 68 65 20 70 6f 73 69 74 69 6f  pies the positio
24e60 6e 20 6c 69 73 74 20 69 6e 74 6f 20 74 68 65 20  n list into the 
24e70 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20  buffer supplied 
24e80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
24e90 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
24ea0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
24eb0 65 72 50 6f 73 6c 69 73 74 42 75 66 66 65 72 28  erPoslistBuffer(
24ec0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
24ed0 49 74 65 72 2c 20 46 74 73 35 42 75 66 66 65 72  Iter, Fts5Buffer
24ee0 20 2a 70 42 75 66 29 7b 0a 20 20 46 74 73 35 49   *pBuf){.  Fts5I
24ef0 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d  ndex *p = pIter-
24f00 3e 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35 53  >pIndex;.  Fts5S
24f10 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
24f20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
24f30 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
24f40 69 72 73 74 20 5d 3b 0a 20 20 61 73 73 65 72 74  irst ];.  assert
24f50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
24f60 4f 4b 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66  OK );.  fts5Buff
24f70 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
24f80 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
24f90 73 74 28 70 2c 20 70 53 65 67 2c 20 30 2c 20 70  st(p, pSeg, 0, p
24fa0 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  Buf);.  return f
24fb0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24fc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
24fd0 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70  e an iterator op
24fe0 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
24ff0 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
25000 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
25010 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
25020 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
25030 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
25040 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
25050 74 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49  ter ){.    Fts5I
25060 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
25070 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Iter->pIndex;.  
25080 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
25090 72 65 65 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ree(pIter->pInde
250a0 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 66  x, pIter);.    f
250b0 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
250c0 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Index);.  }.}../
250d0 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 64 65  *.** Read and de
250e0 63 6f 64 65 20 74 68 65 20 22 61 76 65 72 61 67  code the "averag
250f0 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  es" record from 
25100 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
25110 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
25120 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74  nSize must point
25130 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
25140 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65  size nCol, where
25150 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20   nCol is.** the 
25160 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64  number of user d
25170 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69  efined columns i
25180 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e  n the FTS table.
25190 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
251a0 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72 61  ts5IndexGetAvera
251b0 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ges(Fts5Index *p
251c0 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36  , i64 *pnRow, i6
251d0 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e  4 *anSize){.  in
251e0 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e  t nCol = p->pCon
251f0 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73  fig->nCol;.  Fts
25200 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
25210 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d   *pnRow = 0;.  m
25220 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c  emset(anSize, 0,
25230 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e   sizeof(i64) * n
25240 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d 20  Col);.  pData = 
25250 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
25260 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
25270 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  WID);.  if( p->r
25280 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25290 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pData->nn ){.   
252a0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
252b0 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20  int iCol;.    i 
252c0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
252d0 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28  (&pData->p[i], (
252e0 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20  u64*)pnRow);.   
252f0 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70   for(iCol=0; i<p
25300 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c  Data->nn && iCol
25310 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  <nCol; iCol++){.
25320 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
25330 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
25340 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e  >p[i], (u64*)&an
25350 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  Size[iCol]);.   
25360 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61   }.  }..  fts5Da
25370 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
25380 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
25390 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
253a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ../*.** Replace 
253b0 74 68 65 20 63 75 72 72 65 6e 74 20 22 61 76 65  the current "ave
253c0 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 77 69  rages" record wi
253d0 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
253e0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
253f0 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68  * supplied as th
25400 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25410 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
25420 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65  3Fts5IndexSetAve
25430 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
25440 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  *p, const u8 *pD
25450 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
25460 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
25470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
25480 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
25490 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
254a0 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44  ROWID, pData, nD
254b0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ata);.  return f
254c0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
254d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
254e0 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
254f0 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68  ber of blocks th
25500 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65  is module has re
25510 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ad from the %_da
25520 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63  ta.** table sinc
25530 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64  e it was created
25540 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25550 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28 46  Fts5IndexReads(F
25560 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
25570 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b  return p->nRead;
25580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25590 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20  e 32-bit cookie 
255a0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20  value stored at 
255b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c  the start of all
255c0 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72   structure .** r
255d0 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61  ecords to the va
255e0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
255f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25600 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
25610 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
25620 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
25630 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25640 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
25650 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
25660 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
25670 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64  etCookie(Fts5Ind
25680 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29  ex *p, int iNew)
25690 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
256c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
256d0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
256e0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20   = p->pConfig;  
256f0 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
25700 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  on object */.  u
25710 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20  8 aCookie[4];   
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72 65      /* Binary re
25740 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
25750 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65  iNew */.  sqlite
25760 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20  3_blob *pBlob = 
25770 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
25780 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
25790 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ;.  sqlite3Fts5P
257a0 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e  ut32(aCookie, iN
257b0 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ew);..  rc = sql
257c0 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70  ite3_blob_open(p
257d0 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e  Config->db, pCon
257e0 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
257f0 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22 62  taTbl, .      "b
25800 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52 55  lock", FTS5_STRU
25810 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20  CTURE_ROWID, 1, 
25820 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66  &pBlob.  );.  if
25830 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25840 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
25850 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c  lob_write(pBlob,
25860 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b   aCookie, 4, 0);
25870 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25880 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
25890 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ob);.  }..  retu
258a0 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
258b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f  lite3Fts5IndexLo
258c0 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64  adConfig(Fts5Ind
258d0 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
258e0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
258f0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
25900 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
25910 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
25920 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
25930 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ct);.  return ft
25940 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
25950 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
25960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
259b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
259f0 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
25a00 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
25a10 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74  ation of the int
25a20 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a  egrity-check .**
25a30 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a   functionality..
25a40 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
25a50 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73   a simple checks
25a60 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f  um value based o
25a70 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e  n the arguments.
25a80 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66  .*/.static u64 f
25a90 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
25aa0 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64  um(.  i64 iRowid
25ab0 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a  , .  int iCol, .
25ac0 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69    int iPos, .  i
25ad0 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
25ae0 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20   char *pTerm,.  
25af0 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69  int nTerm.){.  i
25b00 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20  nt i;.  u64 ret 
25b10 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20  = iRowid;.  ret 
25b20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
25b30 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
25b40 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
25b50 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72 65  if( iIdx>=0 ) re
25b60 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
25b70 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  (FTS5_MAIN_PREFI
25b80 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f 72  X + iIdx);.  for
25b90 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
25ba0 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ++) ret += (ret<
25bb0 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a  <3) + pTerm[i];.
25bc0 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
25bd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25be0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
25bf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65  function is pure
25c00 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
25c10 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
25c20 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
25c30 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
25c40 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
25c50 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
25c60 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
25c70 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74  *.** Instead, it
25c80 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20   tests that the 
25c90 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f  same set of pgno
25ca0 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
25cb0 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69  ons are .** visi
25cc0 74 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ted regardless o
25cd0 66 20 77 68 65 74 68 65 72 20 74 68 65 20 64 6f  f whether the do
25ce0 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e  clist-index iden
25cf0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
25d00 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69  ters.** iSegid/i
25d10 4c 65 61 66 20 69 73 20 69 74 65 72 61 74 65 64  Leaf is iterated
25d20 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20   in forwards or 
25d30 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a  reverse order..*
25d40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25d50 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
25d60 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  se(.  Fts5Index 
25d70 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  *p, .  int iSegi
25d80 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
25d90 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
25da0 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f  t id to load fro
25db0 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  m */.  int iLeaf
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64         /* Load d
25de0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
25df0 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b   this leaf */.){
25e00 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
25e10 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20   *pDlidx = 0;.  
25e20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b  u64 cksum1 = 13;
25e30 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
25e40 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64  13;..  for(pDlid
25e50 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
25e60 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64  nit(p, 0, iSegid
25e70 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
25e80 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
25e90 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
25ea0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
25eb0 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
25ec0 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
25ed0 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
25ee0 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
25ef0 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
25f00 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
25f10 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
25f20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e     assert( pgno>
25f30 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73  iLeaf );.    cks
25f40 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20  um1 += iRowid + 
25f50 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b  ((i64)pgno<<32);
25f60 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78  .  }.  fts5Dlidx
25f70 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
25f80 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a  ;.  pDlidx = 0;.
25f90 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
25fa0 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
25fb0 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 1, iSegid, iL
25fc0 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
25fd0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
25fe0 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
25ff0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
26000 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  rev(p, pDlidx). 
26010 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
26020 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
26030 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
26040 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
26050 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
26060 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
26070 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78  ssert( fts5Dlidx
26080 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
26090 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
260a0 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b  sum2 += iRowid +
260b0 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29   ((i64)pgno<<32)
260c0 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
260d0 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
260e0 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
260f0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
26100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
26110 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e  m1!=cksum2 ) p->
26120 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
26130 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  T;.}..static int
26140 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
26150 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78     /* Fts5 index
26180 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
26190 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63   iIdx,.  const c
261a0 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
261b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
261c0 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66  x key to query f
261d0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  or */.  int n,  
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
26200 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20  of index key in 
26210 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66  bytes */.  int f
26220 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
26230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
26240 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65  ags for Fts5Inde
26250 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20  xQuery */.  u64 
26260 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20  *pCksum         
26270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26280 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20  N/OUT: Checksum 
26290 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 36  value */.){.  u6
262a0 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
262b0 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
262c0 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d 20 30  er *pIdxIter = 0
262d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
262e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
262f0 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67  ry(p, z, n, flag
26300 73 2c 20 30 2c 20 26 70 49 64 78 49 74 65 72 29  s, 0, &pIdxIter)
26310 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  ;..  while( rc==
26320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
26330 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
26340 6f 66 28 70 49 64 78 49 74 65 72 29 20 29 7b 0a  of(pIdxIter) ){.
26350 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20      i64 dummy;. 
26360 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f     const u8 *pPo
26370 73 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  s;.    int nPos;
26380 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d  .    i64 rowid =
26390 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
263a0 52 6f 77 69 64 28 70 49 64 78 49 74 65 72 29 3b  Rowid(pIdxIter);
263b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
263c0 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74  3Fts5IterPoslist
263d0 28 70 49 64 78 49 74 65 72 2c 20 30 2c 20 26 70  (pIdxIter, 0, &p
263e0 50 6f 73 2c 20 26 6e 50 6f 73 2c 20 26 64 75 6d  Pos, &nPos, &dum
263f0 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  my);.    if( rc=
26400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26410 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
26420 65 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20  eader sReader;. 
26430 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33       for(sqlite3
26440 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
26450 72 49 6e 69 74 28 70 50 6f 73 2c 20 6e 50 6f 73  rInit(pPos, nPos
26460 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20  , &sReader);.   
26470 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62         sReader.b
26480 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  Eof==0;.        
26490 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
264a0 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
264b0 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29  sReader).      )
264c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
264d0 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  ol = FTS5_POS2CO
264e0 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f  LUMN(sReader.iPo
264f0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
26500 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32  iOff = FTS5_POS2
26510 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69  OFFSET(sReader.i
26520 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
26530 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  sum ^= fts5Index
26540 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64  EntryCksum(rowid
26550 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49  , iCol, iOff, iI
26560 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  dx, z, n);.     
26570 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
26580 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
26590 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20  t(pIdxIter);.   
265a0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
265b0 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49  Fts5IterClose(pI
265c0 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b  dxIter);..  *pCk
265d0 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72  sum = cksum;.  r
265e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
265f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26600 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79  n is also purely
26610 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
26620 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
26630 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
26640 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
26650 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
26660 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
26670 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
26680 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
26690 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35  TestTerm(.  Fts5
266a0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
266b0 35 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20  5Buffer *pPrev, 
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
266d0 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  Previous term */
266e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
266f0 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
26700 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e     /* Possibly n
26710 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20  ew term to test 
26720 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65  */.  u64 expecte
26730 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  d,.  u64 *pCksum
26740 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  .){.  int rc = p
26750 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65  ->rc;.  if( pPre
26760 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  v->n==0 ){.    f
26770 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
26780 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e  , pPrev, n, (con
26790 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c  st u8*)z);.  }el
267a0 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  se.  if( rc==SQL
267b0 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76  ITE_OK && (pPrev
267c0 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70  ->n!=n || memcmp
267d0 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29  (pPrev->p, z, n)
267e0 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73  ) ){.    u64 cks
267f0 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  um3 = *pCksum;. 
26800 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26810 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  Term = (const ch
26820 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d  ar*)&pPrev->p[1]
26830 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20  ;  /* term sans 
26840 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20  prefix-byte */. 
26850 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
26860 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20  Prev->n-1;      
26870 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
26880 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
26890 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20  */.    int iIdx 
268a0 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d  = (pPrev->p[0] -
268b0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
268c0 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  X);.    int flag
268d0 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30  s = (iIdx==0 ? 0
268e0 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   : FTS5INDEX_QUE
268f0 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  RY_PREFIX);.    
26900 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20  u64 ck1 = 0;.   
26910 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20   u64 ck2 = 0;.. 
26920 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
26930 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74   the results ret
26940 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e  urned for ASC an
26950 64 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61  d DESC queries a
26960 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
26970 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c  me. If not, call
26980 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e   this corruption
26990 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  .  */.    rc = f
269a0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
269b0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
269c0 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31  erm, flags, &ck1
269d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
269e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
269f0 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
26a00 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
26a10 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d  DESC;.      rc =
26a20 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
26a30 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
26a40 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
26a50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
26a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26a70 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
26a80 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
26a90 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
26aa0 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c   a prefix query,
26ab0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
26ac0 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
26ad0 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   if the.    ** t
26ae0 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61  he index is disa
26af0 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d  bled are the sam
26b00 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61  e. In both ASC a
26b10 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a  nd DESC order. .
26b20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
26b30 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c  is check may onl
26b40 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
26b50 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
26b60 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a   is empty. This.
26b70 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73      ** is becaus
26b80 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
26b90 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
26ba0 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65   single scan que
26bb0 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74  ry at.    ** a t
26bc0 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c  ime, and the mul
26bd0 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f  ti-iter loop fro
26be0 6d 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e  m which this fun
26bf0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a  ction is called.
26c00 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
26c10 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63  y performing suc
26c20 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  h a scan. */.   
26c30 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
26c40 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
26c50 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
26c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26c70 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
26c80 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
26c90 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
26ca0 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
26cb0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
26cc0 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
26cd0 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
26ce0 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
26cf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26d00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
26d10 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
26d20 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
26d30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64   }.      if( iId
26d40 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
26d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26d60 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
26d70 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
26d80 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44  ST_NOIDX|FTS5IND
26d90 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20  EX_QUERY_DESC;. 
26da0 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
26db0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
26dc0 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
26dd0 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
26de0 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
26df0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26e00 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
26e10 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
26e20 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
26e30 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d      }..    cksum
26e40 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74  3 ^= ck1;.    ft
26e50 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
26e60 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
26e70 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69  t u8*)z);..    i
26e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26e90 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65   && cksum3!=expe
26ea0 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  cted ){.      rc
26eb0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
26ec0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73  .    }.    *pCks
26ed0 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d  um = cksum3;.  }
26ee0 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d  .  p->rc = rc;.}
26ef0 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  . .#else.# defin
26f00 65 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  e fts5TestDlidxR
26f10 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20  everse(x,y,z).# 
26f20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54  define fts5TestT
26f30 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  erm(u,v,w,x,y,z)
26f40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
26f50 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  heck that:.**.**
26f60 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73     1) All leaves
26f70 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e   of pSeg between
26f80 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73   iFirst and iLas
26f90 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78  t (inclusive) ex
26fa0 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ist and.**      
26fb0 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72  contain zero ter
26fc0 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20  ms..**   2) All 
26fd0 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62  leaves of pSeg b
26fe0 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20  etween iNoRowid 
26ff0 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75  and iLast (inclu
27000 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a  sive) exist and.
27010 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
27020 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a  zero rowids..*/.
27030 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
27040 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
27050 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35  eckEmpty(.  Fts5
27060 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
27070 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
27080 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53   *pSeg,     /* S
27090 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  egment to check 
270a0 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74  internal consist
270b0 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ency */.  int iF
270c0 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52  irst,.  int iNoR
270d0 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73  owid,.  int iLas
270e0 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  t.){.  int i;.. 
270f0 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
27100 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
27110 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
27120 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
27130 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78  leaf.  ** (a) ex
27140 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ist and (b) cont
27150 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f  ain no terms. */
27160 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
27170 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27180 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69  K && i<=iLast; i
27190 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  ++){.    Fts5Dat
271a0 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44  a *pLeaf = fts5D
271b0 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
271c0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
271d0 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b  eg->iSegid, i));
271e0 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29  .    if( pLeaf )
271f0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73  {.      if( !fts
27200 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
27210 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
27220 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
27230 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52       if( i>=iNoR
27240 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c  owid && 0!=fts5L
27250 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
27260 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20  (pLeaf) ) p->rc 
27270 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
27280 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61      }.    fts5Da
27290 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
272a0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
272b0 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72 69  void fts5Integri
272c0 74 79 43 68 65 63 6b 50 67 69 64 78 28 46 74 73  tyCheckPgidx(Fts
272d0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
272e0 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69  ata *pLeaf){.  i
272f0 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b  nt iTermOff = 0;
27300 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74  .  int ii;..  Ft
27310 73 35 42 75 66 66 65 72 20 62 75 66 31 20 3d 20  s5Buffer buf1 = 
27320 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42  {0,0,0};.  Fts5B
27330 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c  uffer buf2 = {0,
27340 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c  0,0};..  ii = pL
27350 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77  eaf->szLeaf;.  w
27360 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e  hile( ii<pLeaf->
27370 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  nn && p->rc==SQL
27380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
27390 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69  t res;.    int i
273a0 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  Off;.    int nIn
273b0 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66  cr;..    ii += f
273c0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
273d0 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49  pLeaf->p[ii], nI
273e0 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f  ncr);.    iTermO
273f0 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20  ff += nIncr;.   
27400 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
27410 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  ;..    if( iOff>
27420 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
27430 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
27440 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27450 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
27460 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20  mOff==nIncr ){. 
27470 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
27480 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
27490 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
274a0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
274b0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
274c0 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c   (iOff+nByte)>pL
274d0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
274e0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
274f0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
27500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27510 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
27520 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e  &p->rc, &buf1, n
27530 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b  Byte, &pLeaf->p[
27540 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  iOff]);.      }.
27550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27560 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74   int nKeep, nByt
27570 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  e;.      iOff +=
27580 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
27590 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
275a0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
275b0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
275c0 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
275d0 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  p[iOff], nByte);
275e0 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70  .      if( nKeep
275f0 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66  >buf1.n || (iOff
27600 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73  +nByte)>pLeaf->s
27610 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
27620 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
27630 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
27640 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31  se{.        buf1
27650 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  .n = nKeep;.    
27660 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
27670 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
27680 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26   &buf1, nByte, &
27690 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b  pLeaf->p[iOff]);
276a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
276b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
276c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
276d0 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
276e0 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26  Compare(&buf1, &
276f0 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69  buf2);.        i
27700 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72  f( res<=0 ) p->r
27710 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27730 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
27740 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c  t(&p->rc, &buf2,
27750 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29   buf1.n, buf1.p)
27760 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66  ;.  }..  fts5Buf
27770 66 65 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a  ferFree(&buf1);.
27780 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
27790 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74  (&buf2);.}..stat
277a0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
277b0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
277c0 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
277d0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
277e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
277f0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
27800 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
27810 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
27820 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
27830 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e   to check intern
27840 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  al consistency *
27850 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  /.){.  Fts5Confi
27860 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
27870 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74  pConfig;.  sqlit
27880 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
27890 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20   0;.  int rc2;. 
278a0 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61   int iIdxPrevLea
278b0 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  f = pSeg->pgnoFi
278c0 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c  rst-1;.  int iDl
278d0 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  idxPrevLeaf = pS
278e0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20  eg->pgnoLast;.. 
278f0 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
27900 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  irst==0 ) return
27910 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72  ;..  fts5IndexPr
27920 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53  epareStmt(p, &pS
27930 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  tmt, sqlite3_mpr
27940 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c  intf(.      "SEL
27950 45 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c  ECT segid, term,
27960 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e   (pgno>>1), (pgn
27970 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  o&1) FROM %Q.'%q
27980 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
27990 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f  d=%d",.      pCo
279a0 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
279b0 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d  ig->zName, pSeg-
279c0 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20  >iSegid.  ));.. 
279d0 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f   /* Iterate thro
279e0 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68  ugh the b-tree h
279f0 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20  ierarchy.  */.  
27a00 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
27a10 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
27a20 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
27a30 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
27a40 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20    i64 iRow;     
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69  /* Rowid for thi
27a70 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74  s leaf */.    Ft
27a80 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20  s5Data *pLeaf;  
27a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27aa0 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61  ata for this lea
27ab0 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49  f */..    int nI
27ac0 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33  dxTerm = sqlite3
27ad0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
27ae0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e  tmt, 1);.    con
27af0 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72  st char *zIdxTer
27b00 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
27b10 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
27b20 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
27b30 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66      int iIdxLeaf
27b40 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
27b50 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b  n_int(pStmt, 2);
27b60 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69  .    int bIdxDli
27b70 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dx = sqlite3_col
27b80 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33  umn_int(pStmt, 3
27b90 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27ba0 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69  e leaf in questi
27bb0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
27bc0 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d  een trimmed from
27bd0 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20   the segment, . 
27be0 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69     ** ignore thi
27bf0 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20  s b-tree entry. 
27c00 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20  Otherwise, load 
27c10 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  it into memory. 
27c20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c  */.    if( iIdxL
27c30 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eaf<pSeg->pgnoFi
27c40 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rst ) continue;.
27c50 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f      iRow = FTS5_
27c60 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
27c70 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78  eg->iSegid, iIdx
27c80 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66  Leaf);.    pLeaf
27c90 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
27ca0 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66  p, iRow);.    if
27cb0 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ( pLeaf==0 ) bre
27cc0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  ak;..    /* Chec
27cd0 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
27ce0 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73  contains at leas
27cf0 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20  t one term, and 
27d00 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c  that it is equal
27d10 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61  .    ** to or la
27d20 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70  rger than the sp
27d30 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54  lit-key in zIdxT
27d40 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b  erm.  Also check
27d50 20 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20   that if there. 
27d60 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20     ** is also a 
27d70 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69  rowid pointer wi
27d80 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61  thin the leaf pa
27d90 67 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f  ge header, it po
27da0 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a  ints to a.    **
27db0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
27dc0 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20   the term.  */. 
27dd0 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e     if( pLeaf->nn
27de0 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  <=pLeaf->szLeaf 
27df0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
27e00 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
27e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27e20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
27e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27e40 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
27e50 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20  erm on leaf */. 
27e60 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
27e70 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
27e80 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
27e90 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61  rst rowid on lea
27ea0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  f */.      int n
27eb0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
27ec0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
27ed0 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69  f term on leaf i
27ee0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
27ef0 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27f10 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65  Comparison of te
27f20 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79  rm and split-key
27f30 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20   */..      iOff 
27f40 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  = fts5LeafFirstT
27f50 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  ermOff(pLeaf);. 
27f60 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
27f70 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
27f80 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  widOff(pLeaf);. 
27f90 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
27fa0 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20  ff>=iOff ){.    
27fb0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
27fc0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
27fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
27fe0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
27ff0 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
28000 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a  [iOff], nTerm);.
28010 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65          res = me
28020 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69  mcmp(&pLeaf->p[i
28030 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20  Off], zIdxTerm, 
28040 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54  MIN(nTerm, nIdxT
28050 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69  erm));.        i
28060 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
28070 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54 65  = nTerm - nIdxTe
28080 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
28090 72 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20  res<0 ) p->rc = 
280a0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
280b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73      }..      fts
280c0 35 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50  5IntegrityCheckP
280d0 67 69 64 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a  gidx(p, pLeaf);.
280e0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61      }.    fts5Da
280f0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
28100 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
28110 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
28120 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
28130 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
28140 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
28150 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
28160 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69  f.    ** (a) exi
28170 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
28180 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
28190 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74      fts5IndexInt
281a0 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79  egrityCheckEmpty
281b0 28 0a 20 20 20 20 20 20 20 20 70 2c 20 70 53 65  (.        p, pSe
281c0 67 2c 20 69 49 64 78 50 72 65 76 4c 65 61 66 2b  g, iIdxPrevLeaf+
281d0 31 2c 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61  1, iDlidxPrevLea
281e0 66 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a  f+1, iIdxLeaf-1.
281f0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
28200 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
28210 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
28220 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
28230 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  x, check that it
28240 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f   looks right. */
28250 0a 20 20 20 20 69 66 28 20 62 49 64 78 44 6c 69  .    if( bIdxDli
28260 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  dx ){.      Fts5
28270 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
28280 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69  x = 0;  /* For i
28290 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
282a0 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a   doclist index *
282b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 65  /.      int iPre
282c0 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66  vLeaf = iIdxLeaf
282d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
282e0 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69  id = pSeg->iSegi
282f0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67  d;.      int iPg
28300 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20   = 0;.      i64 
28310 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72  iKey;..      for
28320 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
28330 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20  xIterInit(p, 0, 
28340 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
28350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
28360 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
28370 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
28380 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78         fts5Dlidx
28390 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
283a0 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20  dx).      ){..  
283b0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61        /* Check a
283c0 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61  ny rowid-less pa
283d0 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  ges that occur b
283e0 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
283f0 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20  t leaf. */.     
28400 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76     for(iPg=iPrev
28410 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35  Leaf+1; iPg<fts5
28420 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
28430 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20  lidx); iPg++){. 
28440 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20           iKey = 
28450 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
28460 49 44 28 69 53 65 67 69 64 2c 20 69 50 67 29 3b  ID(iSegid, iPg);
28470 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66  .          pLeaf
28480 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
28490 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  p, iKey);.      
284a0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
284b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
284c0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
284d0 77 69 64 4f 66 66 28 70 4c 65 61 66 29 21 3d 30  widOff(pLeaf)!=0
284e0 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
284f0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
28500 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
28510 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
28520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28530 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65 76   }.        iPrev
28540 4c 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78  Leaf = fts5Dlidx
28550 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
28560 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
28570 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
28580 66 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64  f page indicated
28590 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
285a0 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20   really does.   
285b0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20       ** contain 
285c0 74 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73  the rowid sugges
285d0 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e  ted by the same.
285e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79   */.        iKey
285f0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
28600 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50  ROWID(iSegid, iP
28610 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  revLeaf);.      
28620 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
28630 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b  taRead(p, iKey);
28640 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
28650 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
28660 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
28670 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
28680 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
28690 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
286a0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53  f);.          AS
286b0 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
286c0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
286d0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
286e0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
286f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
28700 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
28710 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  T;.          }el
28720 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
28730 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
28740 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66  Leaf->p[iRowidOf
28750 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69  f], (u64*)&iRowi
28760 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
28770 69 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35  if( iRowid!=fts5
28780 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
28790 44 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d  Dlidx) ) p->rc =
287a0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
287b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
287c0 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
287d0 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
287e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
287f0 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76        iDlidxPrev
28800 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20 20 20 20  Leaf = iPg;.    
28810 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
28820 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ree(pDlidx);.   
28830 20 20 20 66 74 73 35 54 65 73 74 44 6c 69 64 78     fts5TestDlidx
28840 52 65 76 65 72 73 65 28 70 2c 20 69 53 65 67 69  Reverse(p, iSegi
28850 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20  d, iIdxLeaf);.  
28860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
28870 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20  DlidxPrevLeaf = 
28880 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a  pSeg->pgnoLast;.
28890 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
288a0 68 65 63 6b 20 74 68 65 72 65 20 69 73 20 6e 6f  heck there is no
288b0 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a   doclist index *
288c0 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 49 64  /.    }..    iId
288d0 78 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78  xPrevLeaf = iIdx
288e0 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32  Leaf;.  }..  rc2
288f0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
28900 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
28910 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
28920 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32  OK ) p->rc = rc2
28930 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69 74 65  ;..  /* Page ite
28940 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77  r.iLeaf must now
28950 20 62 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73   be the rightmos
28960 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74  t leaf-page in t
28970 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69  he segment */.#i
28980 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  f 0.  if( p->rc=
28990 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74  =SQLITE_OK && it
289a0 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e  er.iLeaf!=pSeg->
289b0 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
289c0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
289d0 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RUPT;.  }.#endif
289e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69  .}.../*.** Run i
289f0 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74  nternal checks t
28a00 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
28a10 65 20 46 54 53 20 69 6e 64 65 78 20 28 61 29 20  e FTS index (a) 
28a20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a  is internally .*
28a30 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  * consistent and
28a40 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e   (b) contains en
28a50 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20  tries for which 
28a60 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63  the XOR of the c
28a70 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63  hecksums.** as c
28a80 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66 74 73  alculated by fts
28a90 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
28aa0 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a  () is cksum..**.
28ab0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
28ac0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
28ad0 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
28ae0 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20  checks fail, or 
28af0 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  if the.** checks
28b00 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  um does not matc
28b10 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  h. Return SQLITE
28b20 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b  _OK if all check
28b30 73 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a  s pass without.*
28b40 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65  * error, or some
28b50 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72   other SQLite er
28b60 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74  ror code if anot
28b70 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20  her error (e.g. 
28b80 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  OOM).** occurs..
28b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
28ba0 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
28bb0 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20  Check(Fts5Index 
28bc0 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a  *p, u64 cksum){.
28bd0 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30    u64 cksum2 = 0
28be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28bf0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
28c00 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
28c10 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
28c20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
28c30 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  st = {0,0,0};   
28c40 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
28c50 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74  o hold a poslist
28c60 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
28c70 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20  ter *pIter;     
28c80 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
28c90 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
28ca0 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f   entire index */
28cb0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
28cc0 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20   *pStruct;      
28cd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
28ce0 63 74 75 72 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55  cture */..  /* U
28cf0 73 65 64 20 62 79 20 65 78 74 72 61 20 69 6e 74  sed by extra int
28d00 65 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79  ernal tests only
28d10 20 72 75 6e 20 69 66 20 4e 44 45 42 55 47 20 69   run if NDEBUG i
28d20 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f  s not defined */
28d30 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20  .  u64 cksum3 = 
28d40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
28d50 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
28d60 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73  ased on contents
28d70 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20   of indexes */. 
28d80 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
28d90 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20   = {0,0,0};     
28da0 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
28db0 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63  to hold most rec
28dc0 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 0a 20  ent term */.  . 
28dd0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53   /* Load the FTS
28de0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
28df0 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20   */.  pStruct = 
28e00 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
28e10 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  d(p);..  /* Chec
28e20 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72  k that the inter
28e30 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63  nal nodes of eac
28e40 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20  h segment match 
28e50 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  the leaves */.  
28e60 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
28e70 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
28e80 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  g;.    for(iLvl=
28e90 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
28ea0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
28eb0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  {.      for(iSeg
28ec0 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
28ed0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
28ee0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
28ef0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
28f00 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
28f10 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
28f20 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
28f30 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74  Seg];.        ft
28f40 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
28f50 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20  CheckSegment(p, 
28f60 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSeg);.      }. 
28f70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
28f80 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e  he cksum argumen
28f90 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
28fa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
28fb0 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
28fc0 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e  ed.  ** based on
28fd0 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e   all expected en
28fe0 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53  tries in the FTS
28ff0 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e   index (includin
29000 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20  g prefix index. 
29010 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68   ** entries). Th
29020 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20  is block checks 
29030 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20  that a checksum 
29040 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
29050 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   on the.  ** act
29060 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ual contents of 
29070 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64 65  FTS index is ide
29080 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ntical..  **.  *
29090 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
290a0 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b  f the same check
290b0 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74  sum are calculat
290c0 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28 73  ed. The first (s
290d0 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62  tack.  ** variab
290e0 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64  le cksum2) based
290f0 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72   on entries extr
29100 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
29110 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20  ull-text index. 
29120 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20   ** while doing 
29130 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  a linear scan of
29140 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
29150 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20   index in turn. 
29160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61  .  **.  ** As ea
29170 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64 20  ch term visited 
29180 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63  by the linear sc
29190 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65 20  ans, a separate 
291a0 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20  query for the.  
291b0 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20  ** same term is 
291c0 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d  performed. cksum
291d0 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  3 is calculated 
291e0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74  based on the ent
291f0 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63  ries.  ** extrac
29200 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75 65  ted by these que
29210 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ries..  */.  for
29220 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
29230 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c  w(p, pStruct, 0,
29240 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c   0, 0, 0, -1, 0,
29250 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20   &pIter);.      
29260 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
29270 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20  (p, pIter)==0;. 
29280 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
29290 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
292a0 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20   0, 0).  ){.    
292b0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
292c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
292d0 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
292e0 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20  ytes */.    i64 
292f0 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20  iPos = 0;       
29300 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
29310 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f  ion read from po
29320 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  slist */.    int
29330 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20   iOff = 0;      
29340 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
29350 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73  et within poslis
29360 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  t */.    i64 iRo
29370 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
29380 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
29390 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
293a0 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49  char*)fts5MultiI
293b0 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
293c0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
293d0 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72  his is a new ter
293e0 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e  m, query for it.
293f0 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77   Update cksum3 w
29400 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ith the results.
29410 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74   */.    fts5Test
29420 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a  Term(p, &term, z
29430 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b  , n, cksum2, &ck
29440 73 75 6d 33 29 3b 0a 0a 20 20 20 20 70 6f 73 6c  sum3);..    posl
29450 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66  ist.n = 0;.    f
29460 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
29470 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
29480 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
29490 31 5d 2e 69 46 69 72 73 74 5d 20 2c 20 30 2c 20  1].iFirst] , 0, 
294a0 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 77  &poslist);.    w
294b0 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
294c0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
294d0 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
294e0 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
294f0 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 69  iPos) ){.      i
29500 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
29510 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b  OS2COLUMN(iPos);
29520 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f  .      int iTokO
29530 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
29540 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20  FSET(iPos);.    
29550 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35    cksum2 ^= fts5
29560 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
29570 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54  iRowid, iCol, iT
29580 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29  okOff, -1, z, n)
29590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  ;.    }.  }.  ft
295a0 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74  s5TestTerm(p, &t
295b0 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d  erm, 0, 0, cksum
295c0 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20  2, &cksum3);..  
295d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
295e0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69  e(p, pIter);.  i
295f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
29600 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b  _OK && cksum!=ck
29610 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
29620 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
29630 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
29640 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
29650 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
29660 26 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75  &term);.  fts5Bu
29670 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73  fferFree(&poslis
29680 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
29690 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
296a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75  .}.../*.** Calcu
296b0 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  late and return 
296c0 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61 74 20  a checksum that 
296d0 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68  is the XOR of th
296e0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
296f0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c   checksum of all
29700 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 6f   entries that wo
29710 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64  uld be generated
29720 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20 73 70   by the token sp
29730 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
29740 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75 6d 65  e final 5 argume
29750 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  nts..*/.u64 sqli
29760 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75  te3Fts5IndexCksu
29770 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  m(.  Fts5Config 
29780 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20  *pConfig,       
29790 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
297a0 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
297b0 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65    /* Document te
297e0 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f  rm appears in */
297f0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72     /* Column ter
29820 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a  m appears in */.
29830 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20    int iPos,     
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65    /* Position te
29860 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f  rm appears in */
29870 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
29880 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20  Term, int nTerm 
29890 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20 69 50     /* Term at iP
298a0 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72  os */.){.  u64 r
298b0 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
298c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
298d0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
298e0 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
29910 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
29920 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66 74 73   */..  ret = fts
29930 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
29940 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  (iRowid, iCol, i
29950 50 6f 73 2c 20 30 2c 20 70 54 65 72 6d 2c 20 6e  Pos, 0, pTerm, n
29960 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49  Term);..  for(iI
29970 64 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66  dx=0; iIdx<pConf
29980 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
29990 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  x++){.    int nB
299a0 79 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43  yte = fts5IndexC
299b0 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28  harlenToBytelen(
299c0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43  pTerm, nTerm, pC
299d0 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
299e0 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  Idx]);.    if( n
299f0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Byte ){.      re
29a00 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  t ^= fts5IndexEn
29a10 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
29a20 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 69 49 64   iCol, iPos, iId
29a30 78 2b 31 2c 20 70 54 65 72 6d 2c 20 6e 42 79 74  x+1, pTerm, nByt
29a40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
29a50 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
29a60 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
29a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
29ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29af0 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
29b00 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
29b10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29b20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
29b30 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66  de() scalar.** f
29b40 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f  unction only..*/
29b50 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
29b60 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f   segment-data ro
29b70 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  wid from the %_d
29b80 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ata table. This 
29b90 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74  function is.** t
29ba0 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d  he opposite of m
29bb0 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e  acro FTS5_SEGMEN
29bc0 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74  T_ROWID()..*/.st
29bd0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
29be0 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34  codeRowid(.  i64
29bf0 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c10 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74  Rowid from %_dat
29c20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
29c30 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20   *piSegid,      
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c50 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20  OUT: Segment id 
29c60 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64  */.  int *pbDlid
29c70 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
29c80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69       /* OUT: Dli
29c90 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74  dx flag */.  int
29ca0 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20   *piHeight,     
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29cc0 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20  OUT: Height */. 
29cd0 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20   int *piPgno    
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
29d00 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69  mber */.){.  *pi
29d10 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f  Pgno = (int)(iRo
29d20 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
29d30 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
29d40 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
29d50 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
29d60 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69  A_PAGE_B;..  *pi
29d70 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69  Height = (int)(i
29d80 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
29d90 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
29da0 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20  IGHT_B) - 1));. 
29db0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
29dc0 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a  _DATA_HEIGHT_B;.
29dd0 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69  .  *pbDlidx = (i
29de0 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30  nt)(iRowid & 0x0
29df0 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e  001);.  iRowid >
29e00 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49  >= FTS5_DATA_DLI
29e10 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20  _B;..  *piSegid 
29e20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
29e30 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
29e40 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31  5_DATA_ID_B) - 1
29e50 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ));.}..static vo
29e60 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  id fts5DebugRowi
29e70 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  d(int *pRc, Fts5
29e80 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36  Buffer *pBuf, i6
29e90 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69  4 iKey){.  int i
29ea0 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
29eb0 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20  iPgno, bDlidx;  
29ec0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f       /* Rowid co
29ed0 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74  mpenents */.  ft
29ee0 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b  s5DecodeRowid(iK
29ef0 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  ey, &iSegid, &bD
29f00 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
29f10 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  &iPgno);..  if( 
29f20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
29f30 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f   if( iKey==FTS5_
29f40 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
29f50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
29f60 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
29f70 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
29f80 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b   "{averages} ");
29f90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29fa0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
29fb0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
29fc0 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72  pRc, pBuf, "{str
29fd0 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d  ucture}");.    }
29fe0 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20  .  }.  else{.   
29ff0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a000 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2a010 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65  Rc, pBuf, "{%sse
2a020 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f  gid=%d h=%d pgno
2a030 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62  =%d}",.        b
2a040 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22  Dlidx ? "dlidx "
2a050 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69   : "", iSegid, i
2a060 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
2a070 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
2a080 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
2a090 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
2a0a0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a0c0 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2a0d0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2a0e0 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
2a0f0 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
2a100 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
2a110 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2a120 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
2a130 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
2a140 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
2a150 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
2a160 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2a170 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
2a180 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
2a190 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
2a1a0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
2a1b0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2a1c0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2a1d0 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
2a1e0 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65  %d nMerge=%d nSe
2a1f0 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  g=%d", iLvl, pLv
2a200 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d  l->nMerge, pLvl-
2a210 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20  >nSeg.    );.   
2a220 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2a230 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
2a240 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
2a250 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
2a260 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
2a270 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
2a280 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2a290 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2a2a0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69  (pRc, pBuf, " {i
2a2b0 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  d=%d leaves=%d..
2a2c0 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d}", .         
2a2d0 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70   pSeg->iSegid, p
2a2e0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
2a2f0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
2a300 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
2a310 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2a320 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2a330 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
2a340 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a350 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2a360 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2a370 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2a380 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2a390 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2a3a0 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
2a3b0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
2a3c0 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
2a3d0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
2a3e0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2a3f0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2a400 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
2a410 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
2a420 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
2a430 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2a440 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2a450 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
2a460 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2a470 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2a480 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2a490 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2a4a0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2a4b0 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2a4c0 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2a4d0 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2a500 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
2a510 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
2a520 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
2a530 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
2a540 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
2a550 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
2a560 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
2a570 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
2a580 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a590 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
2a5a0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2a5b0 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
2a5c0 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
2a5d0 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
2a5e0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2a5f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2a600 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2a610 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2a620 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
2a630 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
2a640 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
2a650 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72   an "averages" r
2a660 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63  ecord. This func
2a670 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73  tion .** appends
2a680 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2a690 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2a6a0 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68   of record to th
2a6b0 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
2a6c0 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
2a6d0 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a  d argument. .*/.
2a6e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2a6f0 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a  DecodeAverages(.
2a700 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2a730 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2a740 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2a750 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2a760 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2a770 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f   int i = 0;.  co
2a780 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65  nst char *zSpace
2a790 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28   = "";..  while(
2a7a0 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20   i<nBlob ){.    
2a7b0 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  u64 iVal;.    i 
2a7c0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2a7d0 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69  tVarint(&pBlob[i
2a7e0 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73  ], &iVal);.    s
2a7f0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2a800 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2a810 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20  , pBuf, "%s%d", 
2a820 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61  zSpace, (int)iVa
2a830 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d  l);.    zSpace =
2a840 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   " ";.  }.}../*.
2a850 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
2a860 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
2a870 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
2a880 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
2a890 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
2a8a0 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
2a8b0 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
2a8c0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
2a8d0 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
2a8e0 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
2a8f0 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
2a900 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
2a910 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
2a920 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
2a930 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2a940 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2a950 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2a960 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2a970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a980 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2a990 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2a9a0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2a9b0 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2a9c0 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
2a9d0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
2a9e0 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
2a9f0 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
2aa00 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2aa10 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  &a[iOff], iVal);
2aa20 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2aa30 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2aa40 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2aa50 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a  %d", iVal);.  }.
2aa60 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
2aa70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72  ../*.** The star
2aa80 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e  t of buffer (a/n
2aa90 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  ) contains the s
2aaa0 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  tart of a doclis
2aab0 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a  t. The doclist.*
2aac0 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  * may or may not
2aad0 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74   finish within t
2aae0 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  he buffer. This 
2aaf0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2ab00 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65   a text.** repre
2ab10 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2ab20 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63   part of the doc
2ab30 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65  list that is pre
2ab40 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a  sent to buffer.*
2ab50 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54  * pBuf. .**.** T
2ab60 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2ab70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2ab80 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2ab90 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2aba0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2abb0 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2abc0 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2abd0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2abe0 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2abf0 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64  n){.  i64 iDocid
2ac00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
2ac10 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30   = 0;..  if( n>0
2ac20 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73   ){.    iOff = s
2ac30 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2ac40 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44  int(a, (u64*)&iD
2ac50 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ocid);.    sqlit
2ac60 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2ac70 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2ac80 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2ac90 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77  iDocid);.  }.  w
2aca0 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
2acb0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
2acc0 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
2acd0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2ace0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
2acf0 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
2ad00 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66  Dummy);.    iOff
2ad10 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f   += fts5DecodePo
2ad20 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c  slist(pRc, pBuf,
2ad30 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e   &a[iOff], MIN(n
2ad40 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20  -iOff, nPos));. 
2ad50 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
2ad60 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
2ad70 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  a;.      iOff +=
2ad80 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
2ad90 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
2ada0 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
2adb0 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20        iDocid += 
2adc0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71  iDelta;.      sq
2add0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2ade0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2adf0 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64   pBuf, " id=%lld
2ae00 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  ", iDocid);.    
2ae10 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2ae20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
2ae30 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2ae40 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
2ae50 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
2ae60 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e  n fts5_decode().
2ae70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ae80 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
2ae90 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
2aea0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
2aeb0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2aec0 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
2aed0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aef0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2af00 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
2af10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2af20 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
2af30 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2af40 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
2af50 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af70 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
2af80 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
2af90 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
2afa0 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50  Segid,iHeight,iP
2afb0 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f  gno,bDlidx;/* Ro
2afc0 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a  wid components *
2afd0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42  /.  const u8 *aB
2afe0 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20  lob; int n;     
2aff0 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f      /* Record to
2b000 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20   decode */.  u8 
2b010 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75  *a = 0;.  Fts5Bu
2b020 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20  ffer s;         
2b030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69            /* Bui
2b040 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65  ld up text to re
2b050 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  turn here */.  i
2b060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b070 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2b080 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2b090 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20  .  int nSpace = 
2b0a0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41  0;..  assert( nA
2b0b0 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65  rg==2 );.  memse
2b0c0 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
2b0d0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
2b0e0 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
2b0f0 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
2b100 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61  al[0]);..  /* Ma
2b110 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2b120 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2b130 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c   (a blob) in aBl
2b140 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b  ob[]. The aBlob[
2b150 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66  ].  ** copy is f
2b160 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f  ollowed by FTS5_
2b170 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
2b180 47 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68  G 0x00 bytes, wh
2b190 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a  ich prevents.  *
2b1a0 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  * buffer overrea
2b1b0 64 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 72  ds even if the r
2b1c0 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74  ecord is corrupt
2b1d0 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69  .  */.  n = sqli
2b1e0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
2b1f0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c  apVal[1]);.  aBl
2b200 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
2b210 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d  ue_blob(apVal[1]
2b220 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20  );.  nSpace = n 
2b230 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  + FTS5_DATA_ZERO
2b240 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20  _PADDING;.  a = 
2b250 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35  (u8*)sqlite3Fts5
2b260 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
2b270 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61  nSpace);.  if( a
2b280 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64  ==0 ) goto decod
2b290 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28  e_out;.  memcpy(
2b2a0 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a  a, aBlob, n);...
2b2b0 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
2b2c0 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69  d(iRowid, &iSegi
2b2d0 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65  d, &bDlidx, &iHe
2b2e0 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a  ight, &iPgno);..
2b2f0 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64    fts5DebugRowid
2b300 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64  (&rc, &s, iRowid
2b310 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20  );.  if( bDlidx 
2b320 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
2b330 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44  dlidx;.    Fts5D
2b340 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20  lidxLvl lvl;..  
2b350 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20    dlidx.p = a;. 
2b360 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b     dlidx.nn = n;
2b370 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76  ..    memset(&lv
2b380 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
2b390 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
2b3a0 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c   lvl.pData = &dl
2b3b0 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65  idx;.    lvl.iLe
2b3c0 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a  afPgno = iPgno;.
2b3d0 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69  .    for(fts5Dli
2b3e0 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b  dxLvlNext(&lvl);
2b3f0 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74   lvl.bEof==0; ft
2b400 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
2b410 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c  lvl)){.      sql
2b420 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2b430 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20  pendPrintf(&rc, 
2b440 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  &s, .          "
2b450 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e   %d(%lld)", lvl.
2b460 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69  iLeafPgno, lvl.i
2b470 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20  Rowid.      );. 
2b480 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2b490 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
2b4a0 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54    if( iRowid==FT
2b4b0 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
2b4c0 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  D ){.      fts5D
2b4d0 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 26 72  ecodeAverages(&r
2b4e0 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20  c, &s, a, n);.  
2b4f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2b500 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75  ts5DecodeStructu
2b510 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e  re(&rc, &s, a, n
2b520 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2b530 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  {.    Fts5Buffer
2b540 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
2b550 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
2b560 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61  erm read from pa
2b570 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ge */.    int sz
2b580 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
2b590 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2b5a0 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b  t of pgidx in a[
2b5b0 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67  ] */.    int iPg
2b5c0 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  idxOff;.    int 
2b5d0 69 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20  iPgidxPrev = 0; 
2b5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
2b5f0 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64  vious value read
2b600 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20   from pgidx */. 
2b610 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20     int iTermOff 
2b620 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f  = 0;.    int iRo
2b630 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  widOff = 0;.    
2b640 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e  int iOff;.    in
2b650 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20  t nDoclist;..   
2b660 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
2b670 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
2b680 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20  fer));..    if( 
2b690 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  n<4 ){.      sql
2b6a0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
2b6b0 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63  t(&rc, &s, 7, (c
2b6c0 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70  onst u8*)"corrup
2b6d0 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  t");.      goto 
2b6e0 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20  decode_out;.    
2b6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f  }else{.      iRo
2b700 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74  widOff = fts5Get
2b710 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20  U16(&a[0]);.    
2b720 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a    iPgidxOff = sz
2b730 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31  Leaf = fts5GetU1
2b740 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20  6(&a[2]);.      
2b750 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  if( iPgidxOff<n 
2b760 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47  ){.        fts5G
2b770 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2b780 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f  gidxOff], iTermO
2b790 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
2b7a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
2b7b0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  e the position l
2b7c0 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65 20  ist tail at the 
2b7d0 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67  start of the pag
2b7e0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f  e */.    if( iRo
2b7f0 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20  widOff!=0 ){.   
2b800 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64     iOff = iRowid
2b810 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Off;.    }else i
2b820 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29  f( iTermOff!=0 )
2b830 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  {.      iOff = i
2b840 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c  TermOff;.    }el
2b850 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  se{.      iOff =
2b860 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20   szLeaf;.    }. 
2b870 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73     fts5DecodePos
2b880 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
2b890 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20  [4], iOff-4);.. 
2b8a0 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79     /* Decode any
2b8b0 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61   more doclist da
2b8c0 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
2b8d0 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65 66 6f  on the page befo
2b8e0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  re the.    ** fi
2b8f0 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  rst term. */.   
2b900 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65   nDoclist = (iTe
2b910 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66  rmOff ? iTermOff
2b920 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66   : szLeaf) - iOf
2b930 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64  f;.    fts5Decod
2b940 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
2b950 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63  , &a[iOff], nDoc
2b960 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c  list);..    whil
2b970 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  e( iPgidxOff<n )
2b980 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69 72  {.      int bFir
2b990 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d  st = (iPgidxOff=
2b9a0 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a  =szLeaf);     /*
2b9b0 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74 20   True for first 
2b9c0 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  term on page */.
2b9d0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
2b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2ba00 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  ytes of data */.
2ba10 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a        int iEnd;.
2ba20 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50 67        .      iPg
2ba30 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  idxOff += fts5Ge
2ba40 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
2ba50 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  idxOff], nByte);
2ba60 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72 65  .      iPgidxPre
2ba70 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  v += nByte;.    
2ba80 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50    iOff = iPgidxP
2ba90 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  rev;..      if( 
2baa0 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20  iPgidxOff<n ){. 
2bab0 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
2bac0 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
2bad0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2bae0 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67        iEnd = iPg
2baf0 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b  idxPrev + nByte;
2bb00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bb10 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c        iEnd = szL
2bb20 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eaf;.      }..  
2bb30 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d      if( bFirst==
2bb40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  0 ){.        iOf
2bb50 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2bb60 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
2bb70 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Byte);.        t
2bb80 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  erm.n = nByte;. 
2bb90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66       }.      iOf
2bba0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2bbb0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
2bbc0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74 73  Byte);.      fts
2bbd0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
2bbe0 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42  b(&rc, &term, nB
2bbf0 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  yte, &a[iOff]);.
2bc00 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42        iOff += nB
2bc10 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  yte;..      sqli
2bc20 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2bc30 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20  endPrintf(.     
2bc40 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20       &rc, &s, " 
2bc50 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d  term=%.*s", term
2bc60 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  .n, (const char*
2bc70 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b  )term.p.      );
2bc80 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
2bc90 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
2bca0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
2bcb0 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a  f], iEnd-iOff);.
2bcc0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
2bcd0 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
2bce0 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65  ;.  }.  . decode
2bcf0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
2bd00 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72  free(a);.  if( r
2bd10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bd20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2bd30 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63  lt_text(pCtx, (c
2bd40 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20  onst char*)s.p, 
2bd50 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  s.n, SQLITE_TRAN
2bd60 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b  SIENT);.  }else{
2bd70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2bd80 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
2bd90 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  Ctx, rc);.  }.  
2bda0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
2bdb0 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  s);.}../*.** The
2bdc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2bdd0 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
2bde0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
2bdf0 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f  fts5_rowid()..*/
2be00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2be10 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a  5RowidFunction(.
2be20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2be30 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
2be40 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
2be50 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
2be60 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2be90 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a  s (always 2) */.
2bea0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2beb0 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
2bec0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
2bed0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2bee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2bef0 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  ;.  if( nArg==0 
2bf00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
2bf10 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
2bf20 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74  , "should be: ft
2bf30 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74  s5_rowid(subject
2bf40 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20  , ....)", -1);. 
2bf50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67   }else{.    zArg
2bf60 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2bf70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2bf80 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
2bf90 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
2bfa0 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
2bfb0 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20  segment") ){.   
2bfc0 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
2bfd0 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20       int segid, 
2bfe0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  pgno;.      if( 
2bff0 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20  nArg!=3 ){.     
2c000 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2c010 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
2c020 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75             "shou
2c030 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
2c040 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67  d('segment', seg
2c050 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a  id, pgno))", -1.
2c060 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2c070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c080 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  segid = sqlite3_
2c090 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
2c0a0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e  1]);.        pgn
2c0b0 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  o = sqlite3_valu
2c0c0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b  e_int(apVal[2]);
2c0d0 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20  .        iRowid 
2c0e0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
2c0f0 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f  OWID(segid, pgno
2c100 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c110 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
2c120 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20  pCtx, iRowid);. 
2c130 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2c150 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2c160 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72  x, .        "fir
2c170 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72  st arg to fts5_r
2c180 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27  owid() must be '
2c190 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20  segment'" , -1. 
2c1a0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
2c1b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2c1c0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
2c1d0 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67  t of registering
2c1e0 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65   the FTS5 module
2c1f0 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a   with database.*
2c200 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
2c210 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65   It registers se
2c220 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  veral user-defin
2c230 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
2c240 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69  ons useful.** wi
2c250 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49  th FTS5..**.** I
2c260 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
2c270 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2c280 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
2c290 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74   occurs, some ot
2c2a0 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72  her.** SQLite er
2c2b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c2c0 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  rned instead..*/
2c2d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2c2e0 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65  IndexInit(sqlite
2c2f0 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
2c300 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
2c310 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
2c320 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f    db, "fts5_deco
2c330 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  de", 2, SQLITE_U
2c340 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f  TF8, 0, fts5Deco
2c350 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
2c360 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
2c370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
2c390 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
2c3a0 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
2c3b0 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c  _rowid", -1, SQL
2c3c0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
2c3d0 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20  5RowidFunction, 
2c3e0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
2c3f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..