/ Hex Artifact Content
Login

Artifact 5ab044a67919e2c9f42f0288a39778136154511e:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
28e0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2900: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2910: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2920: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2940: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2950: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2960: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65  */.  int bDelete
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2980: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2990: 77 72 69 74 65 20 69 73 20 61 20 64 65 6c 65 74  write is a delet
29a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  e */..  /* Error
29b0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
29c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
29f0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2a00: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2a10: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2a20: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2a30: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2a40: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2a50: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2a60: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2a80: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2a90: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2aa0: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2ab0: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2ac0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2ad0: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2ae0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2af0: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2b00: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73  ND id<=?" */.  s
2b10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2b20: 78 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f  xWriter;       /
2b30: 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f  * "INSERT ... %_
2b40: 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  idx VALUES(?,?,?
2b50: 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ,?)" */.  sqlite
2b60: 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65  3_stmt *pIdxDele
2b70: 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45  ter;      /* "DE
2b80: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20  LETE FROM %_idx 
2b90: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f  WHERE segid=? */
2ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2bb0: 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69  *pIdxSelect;.  i
2bc0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2be0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2bf0: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2c00: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2c10: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2c20: 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20  u8 *aEof;       
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
2c50: 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
2c60: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f   doclist */..  /
2c70: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
2c80: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
2c90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
2ca0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
2cb0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
2cc0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53  oslist;.  int nS
2cd0: 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.};../*.** T
2ce0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
2d00: 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69  ecord for each i
2d10: 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65  ndex are represe
2d20: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e  nted.** using an
2d30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72   Fts5Structure r
2d40: 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e  ecord in memory.
2d50: 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74   Which uses inst
2d60: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a  ances of the .**
2d70: 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63   other Fts5Struc
2d80: 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73  tureXXX types as
2d90: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a   components..*/.
2da0: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2db0: 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20  tureSegment {.  
2dc0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
2df0: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e30: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
2e40: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
2e70: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
2e80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2e90: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2ea0: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed0: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
2ee0: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
2ef0: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f10: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f20: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
2f30: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
2f40: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
2f50: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
2f60: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
2f70: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
2f80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2f90: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
2fa0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65  /* Object refere
2fd0: 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75  nce count */.  u
2fe0: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3000: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3010: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3020: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  0 */.  int nSegm
3030: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3040: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3050: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  segments in this
3060: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3070: 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20  int nLevel;     
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76  /* Number of lev
30a0: 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  els in this inde
30b0: 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
30c0: 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c  tureLevel aLevel
30d0: 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  [1];   /* Array 
30e0: 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20  of nLevel level 
30f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3100: 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
3110: 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72  f type Fts5SegWr
3120: 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  iter is used to 
3130: 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74  write to segment
3140: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3150: 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20  5PageWriter {.  
3160: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
3190: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
31a0: 20 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78    int iPrevPgidx
31b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
31d0: 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lue written into
31e0: 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35   pgidx */.  Fts5
31f0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3220: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
3230: 46 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78  Fts5Buffer pgidx
3240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3250: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3260: 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20  ning page-index 
3270: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3280: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
3290: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
32a0: 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
32b0: 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  us term on page 
32c0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32d0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20  5DlidxWriter {. 
32e0: 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20   int pgno;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3310: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
3320: 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69  .  int bPrevVali
3330: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3340: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50     /* True if iP
3350: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3360: 20 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20    i64 iPrev;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3390: 77 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65  wid value writte
33a0: 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46  n to page */.  F
33b0: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
33e0: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
33f0: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53  .};.struct Fts5S
3400: 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74  egWriter {.  int
3410: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3440: 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  o */.  Fts5PageW
3450: 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
3460: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72         /* PageWr
3470: 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
3480: 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b   i64 iPrevRowid;
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
34b0: 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75  id written to cu
34c0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
34d0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
34e0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
34f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3500: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
3510: 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75  n doclist */.  u
3520: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  8 bFirstRowidInP
3530: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
3540: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3550: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3560: 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f   page */.  /* TO
3570: 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72  DO1: Can use (wr
3580: 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29  iter.pgidx.n==0)
3590: 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72   instead of bFir
35a0: 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a  stTermInPage */.
35b0: 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49    u8 bFirstTermI
35c0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
35d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
35e0: 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66  t term will be f
35f0: 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a  irst in leaf */.
3600: 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74    int nLeafWritt
3610: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3620: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3630: 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
3640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74  n */.  int nEmpt
3650: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
3660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3670: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74   of contiguous t
3680: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a  erm-less nodes *
3690: 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b  /..  int nDlidx;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
36c0: 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78  d size of aDlidx
36d0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
36e0: 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
36f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  Dlidx;        /*
3700: 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c   Array of Fts5Dl
3710: 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74  idxWriter object
3720: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65  s */..  /* Value
3730: 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  s to insert into
3740: 20 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65   the %_idx table
3750: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
3760: 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20   btterm;        
3770: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65        /* Next te
3780: 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rm to insert int
3790: 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f  o %_idx table */
37a0: 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20  .  int iBtPage; 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37d0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
37e0: 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a  to btterm */.};.
37f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3800: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3810: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3820: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3830: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3860: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3870: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3880: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
38a0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
38b0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
38c0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
38d0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
38e0: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
38f0: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
3900: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a  ch term/rowid.**
3910: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
3920: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
3930: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
3940: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
3950: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
3960: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
3970: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
3980: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
3990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
39a0: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
39b0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
39c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
39d0: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69  f that is the fi
39e0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
39f0: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3a00: 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79  ist data (one by
3a10: 74 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f  te passed the po
3a20: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
3a30: 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f   field)..**   ro
3a40: 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  wid field of the
3a50: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
3a60: 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20  Usually this is 
3a70: 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f  the size field o
3a80: 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74  f the.**   posit
3a90: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54  ion list data. T
3aa0: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3ab0: 69 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  if the rowid for
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
3ad0: 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20  ry .**   is the 
3ae0: 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68  last thing on th
3af0: 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a  e leaf page..**.
3b00: 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42  ** pLeaf:.**   B
3b10: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3b20: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
3b30: 67 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20  ge data. Set to 
3b40: 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  NULL at EOF..**.
3b50: 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  ** iTermLeafPgno
3b60: 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  , iTermLeafOffse
3b70: 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67  t:.**   Leaf pag
3b80: 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e  e number contain
3b90: 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72  ing the last ter
3ba0: 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  m read from the 
3bb0: 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20  segment. And.** 
3bc0: 20 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d    the offset imm
3bd0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
3be0: 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  ng the term data
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a  ..**.** flags:.*
3c00: 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35  *   Mask of FTS5
3c10: 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c  _SEGITER_XXX val
3c20: 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64  ues. Interpreted
3c30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3c40: 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45  **   FTS5_SEGITE
3c50: 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20  R_ONETERM:.**   
3c60: 20 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68    If set, set th
3c70: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
3c80: 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72  int to EOF after
3c90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
3ca0: 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73  list .**     has
3cb0: 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
3cc0: 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
3cd0: 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  to the next term
3ce0: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3cf0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
3d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a  GITER_REVERSE:.*
3d10: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
3d20: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74  is only ever set
3d30: 20 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52   if FTS5_SEGITER
3d40: 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f  _ONETERM is also
3d50: 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20   set. If.**     
3d60: 69 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61  it is set, itera
3d70: 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64  te through rowid
3d80: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
3d90: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
3da0: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
3db0: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
3dc0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
3dd0: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
3de0: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
3df0: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
3e00: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
3e10: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
3e20: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
3e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65  .**.**     For e
3e40: 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ach rowid on the
3e50: 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64   page correspond
3e60: 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
3e70: 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20  nt term, the.** 
3e80: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
3e90: 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  g aRowidOffset[]
3ea0: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
3eb0: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
3ec0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   of the.**     s
3ed0: 74 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73  tart of the "pos
3ee0: 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22  ition-list-size"
3ef0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
3f00: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54  e page..**.** iT
3f10: 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49  ermIdx:.**     I
3f20: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
3f30: 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61  term on iTermLea
3f40: 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74  fPgno..*/.struct
3f50: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
3f60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3f70: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
3f80: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
3f90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
3fa0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
3fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
3fe0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
3ff0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4000: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4010: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4020: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4030: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4050: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4060: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
4070: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
4080: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
4090: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
40a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
40b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
40c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
40d0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
40e0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e   leaf */..  /* N
40f0: 65 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ext method */.  
4100: 76 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74  void (*xNext)(Ft
4110: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
4120: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a  gIter*, int*);..
4130: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e    /* The page an
4140: 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68  d offset from wh
4150: 69 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ich the current 
4160: 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54  term was read. T
4170: 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20  he offset .  ** 
4180: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  is the offset of
4190: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
41a0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
41b0: 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69  doclist.  */.  i
41c0: 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  nt iTermLeafPgno
41d0: 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  ;.  int iTermLea
41e0: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20  fOffset;..  int 
41f0: 69 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20  iPgidxOff;      
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4210: 65 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67  ext offset in pg
4220: 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  idx */.  int iEn
4230: 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  dofDoclist;..  /
4240: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4250: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66  are only used if
4260: 20 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45   the FTS5_SEGITE
4270: 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69  R_REVERSE flag i
4280: 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  s set. */.  int 
4290: 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  iRowidOffset;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
42b0: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20  urrent entry in 
42c0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a  aRowidOffset[] *
42d0: 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66  /.  int nRowidOf
42e0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
42f0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
4300: 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f   size of aRowidO
4310: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f  ffset[] array */
4320: 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66  .  int *aRowidOf
4330: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
4340: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
4350: 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66  ffset to rowid f
4360: 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35  ields */..  Fts5
4370: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
4380: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  x;          /* I
4390: 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
43a0: 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
43b0: 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f   /* Variables po
43c0: 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
43d0: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
43e0: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
43f0: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
4400: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4410: 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52  term */.  i64 iR
4420: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4440: 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20  rent rowid */.  
4450: 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20  int nPos;       
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4480: 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f  es in current po
4490: 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
44a0: 20 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20   u8 bDel;       
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
44d0: 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73  delete flag is s
44e0: 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  et */.};../*.** 
44f0: 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  Argument is a po
4500: 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35  inter to an Fts5
4510: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74  Data structure t
4520: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a  hat contains a .
4530: 2a 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f  ** leaf page..*/
4540: 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f  .#define ASSERT_
4550: 53 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73  SZLEAF_OK(x) ass
4560: 65 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e  ert( \.    (x)->
4570: 73 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20  szLeaf==(x)->nn 
4580: 7c 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d  || (x)->szLeaf==
4590: 66 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d  fts5GetU16(&(x)-
45a0: 3e 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66  >p[2]) \.)..#def
45b0: 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  ine FTS5_SEGITER
45c0: 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64  _ONETERM 0x01.#d
45d0: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54  efine FTS5_SEGIT
45e0: 45 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a  ER_REVERSE 0x02.
45f0: 0a 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./* .** Argument
4600: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4610: 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72   an Fts5Data str
4620: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
4630: 61 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70  ains a leaf.** p
4640: 61 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  age. This macro 
4650: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
4660: 65 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f  e if the leaf co
4670: 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c  ntains no terms,
4680: 20 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20   or.** false if 
4690: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  it contains at l
46a0: 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a  east one term..*
46b0: 2f 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65  /.#define fts5Le
46c0: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20  afIsTermless(x) 
46d0: 28 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20  ((x)->szLeaf >= 
46e0: 28 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e  (x)->nn)..#defin
46f0: 65 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66  e fts5LeafTermOf
4700: 66 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74  f(x, i) (fts5Get
4710: 55 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d  U16(&(x)->p[(x)-
4720: 3e 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d  >szLeaf + (i)*2]
4730: 29 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  ))..#define fts5
4740: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
4750: 66 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36  f(x) (fts5GetU16
4760: 28 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a  ((x)->p))../*.**
4770: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4780: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
4790: 65 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73  e merged results
47a0: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
47b0: 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73  segments,.** vis
47c0: 69 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f  iting each term/
47d0: 72 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68  rowid pair in th
47e0: 65 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a  e merged data..*
47f0: 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77  *.** nSeg is alw
4800: 61 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ays a power of t
4810: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
4820: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
4830: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67  number of.** seg
4840: 6d 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20  ments that this 
4850: 6f 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e  object is mergin
4860: 67 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74  g data from. Bot
4870: 68 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64  h the aSeg[] and
4880: 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72  .** aFirst[] arr
4890: 61 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74  ays are sized at
48a0: 20 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54   nSeg entries. T
48b0: 68 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20  he aSeg[] array 
48c0: 69 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74  is padded.** wit
48d0: 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73  h zeroed objects
48e0: 20 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e   - these are han
48f0: 64 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20  dled as if they 
4900: 77 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f  were iterators o
4910: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74  pened.** on empt
4920: 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  y segments..**.*
4930: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
4940: 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65   comparing segme
4950: 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20  nts aSeg[N] and 
4960: 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65  aSeg[N+1], where
4970: 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e   N is an.** even
4980: 20 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72   number, is stor
4990: 65 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53  ed in aFirst[(nS
49a0: 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72  eg+N)/2]. The "r
49b0: 65 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a  esult" of the .*
49c0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  * comparison in 
49d0: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20  this context is 
49e0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
49f0: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63   iterator that c
4a00: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
4a10: 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  ts to the smalle
4a20: 72 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d  r term/rowid com
4a30: 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74  bination. Iterat
4a40: 6f 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a  ors at EOF are.*
4a50: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
4a60: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
4a70: 61 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74  all other iterat
4a80: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73  ors..**.** aFirs
4a90: 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68  t[1] contains th
4aa0: 65 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b  e index in aSeg[
4ab0: 5d 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  ] of the iterato
4ac0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
4ad0: 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  .** the smallest
4ae0: 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46   key overall. aF
4af0: 69 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65  irst[0] is unuse
4b00: 64 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73  d. .**.** poslis
4b10: 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20  t:.**   Used by 
4b20: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
4b30: 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68  oslist() when th
4b40: 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20  e poslist needs 
4b50: 74 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a  to be buffered..
4b60: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
4b70: 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20   way to tell if 
4b80: 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65  this is populate
4b90: 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72  d or not..*/.str
4ba0: 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65  uct Fts5IndexIte
4bb0: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
4bc0: 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
4bd0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
4be0: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 69 74  hat owns this it
4bf0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35  erator */.  Fts5
4c00: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
4c10: 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ct;         /* D
4c20: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
4c30: 65 20 66 6f 72 20 74 68 69 73 20 69 74 65 72 61  e for this itera
4c40: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  tor */.  Fts5Buf
4c50: 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20  fer poslist;    
4c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
4c70: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75  er containing cu
4c80: 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f  rrent poslist */
4c90: 0a 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  ..  int nSeg;   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
4cc0: 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Seg[] array */. 
4cd0: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74 65 72   /* True to iter
4d00: 61 74 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  ate in reverse o
4d10: 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 62 53 6b  rder */.  u8 bSk
4d20: 69 70 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  ipEmpty;        
4d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d40: 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65 74 65  e to skip delete
4d50: 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 75  d entries */.  u
4d60: 38 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  8 bEof;         
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d80: 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  * True at EOF */
4d90: 0a 20 20 75 38 20 62 46 69 6c 74 65 72 65 64 3b  .  u8 bFiltered;
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
4dc0: 6c 75 6d 6e 2d 66 69 6c 74 65 72 20 61 6c 72 65  lumn-filter alre
4dd0: 61 64 79 20 61 70 70 6c 69 65 64 20 2a 2f 0a 0a  ady applied */..
4de0: 20 20 69 36 34 20 69 53 77 69 74 63 68 52 6f 77    i64 iSwitchRow
4df0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
4e00: 20 20 2f 2a 20 46 69 72 73 74 65 73 74 20 72 6f    /* Firstest ro
4e10: 77 69 64 20 6f 66 20 6f 74 68 65 72 20 74 68 61  wid of other tha
4e20: 6e 20 61 46 69 72 73 74 5b 31 5d 20 2a 2f 0a 20  n aFirst[1] */. 
4e30: 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 61 46   Fts5CResult *aF
4e40: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
4e50: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65 72 67   /* Current merg
4e60: 65 20 73 74 61 74 65 20 28 73 65 65 20 61 62 6f  e state (see abo
4e70: 76 65 29 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ve) */.  Fts5Seg
4e80: 49 74 65 72 20 61 53 65 67 5b 31 5d 3b 20 20 20  Iter aSeg[1];   
4e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
4ea0: 79 20 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65  y of segment ite
4eb0: 72 61 74 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  rators */.};.../
4ec0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
4ed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4ee0: 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  g type is used t
4ef0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4f00: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  h the contents.*
4f10: 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d 69  * of a doclist-i
4f20: 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ndex record..**.
4f30: 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52  ** pData:.**   R
4f40: 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67  ecord containing
4f50: 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
4f60: 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62  ex data..**.** b
4f70: 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f  Eof:.**   Set to
4f80: 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72 61   true once itera
4f90: 74 6f 72 20 68 61 73 20 72 65 61 63 68 65 64 20  tor has reached 
4fa0: 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a  EOF..**.** iOff:
4fb0: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68 65  .**   Set to the
4fc0: 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   current offset 
4fd0: 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70 44  within record pD
4fe0: 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ata..*/.struct F
4ff0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 7b 0a 20 20  ts5DlidxLvl {.  
5000: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5020: 20 44 61 74 61 20 66 6f 72 20 63 75 72 72 65 6e   Data for curren
5030: 74 20 70 61 67 65 20 6f 66 20 74 68 69 73 20 6c  t page of this l
5040: 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  evel */.  int iO
5050: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
5060: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
5070: 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 70  nt offset into p
5080: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 62 45  Data */.  int bE
5090: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
50a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 45 4f          /* At EO
50b0: 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69  F already */.  i
50c0: 6e 74 20 69 46 69 72 73 74 4f 66 66 3b 20 20 20  nt iFirstOff;   
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
50e0: 55 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20  Used by reverse 
50f0: 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 0a 20 20  iterators */..  
5100: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
5110: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  les */.  int iLe
5120: 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  afPgno;         
5130: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
5140: 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
5150: 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
5160: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5180: 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   First rowid on 
5190: 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 2a  leaf iLeafPgno *
51a0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
51b0: 44 6c 69 64 78 49 74 65 72 20 7b 0a 20 20 69 6e  DlidxIter {.  in
51c0: 74 20 6e 4c 76 6c 3b 0a 20 20 69 6e 74 20 69 53  t nLvl;.  int iS
51d0: 65 67 69 64 3b 0a 20 20 46 74 73 35 44 6c 69 64  egid;.  Fts5Dlid
51e0: 78 4c 76 6c 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b  xLvl aLvl[1];.};
51f0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5200: 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75  s5PutU16(u8 *aOu
5210: 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20  t, u16 iVal){.  
5220: 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e  aOut[0] = (iVal>
5230: 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  >8);.  aOut[1] =
5240: 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a   (iVal&0xFF);.}.
5250: 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35  .static u16 fts5
5260: 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20  GetU16(const u8 
5270: 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  *aIn){.  return 
5280: 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20  ((u16)aIn[0] << 
5290: 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a  8) + aIn[1];.} .
52a0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
52b0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62 75 66  and return a buf
52c0: 66 65 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79  fer at least nBy
52d0: 74 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  te bytes in size
52e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
52f0: 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
5300: 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e  ntered, return N
5310: 55 4c 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20  ULL and set the 
5320: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a  error code in.**
5330: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 68   the Fts5Index h
5340: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
5350: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5360: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
5370: 69 64 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f  id *fts5IdxMallo
5380: 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  c(Fts5Index *p, 
5390: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 72 65  int nByte){.  re
53a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35  turn sqlite3Fts5
53b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
53c0: 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  c, nByte);.}../*
53d0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
53e0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
53f0: 70 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74  pLeft buffer wit
5400: 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69  h the pRight/nRi
5410: 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20  ght blob..**.** 
5420: 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c  Return -ve if pL
5430: 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  eft is smaller t
5440: 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66  han pRight, 0 if
5450: 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20   they are equal 
5460: 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69  or.** +ve if pRi
5470: 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ght is smaller t
5480: 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74  han pLeft. In ot
5490: 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  her words:.**.**
54a0: 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66       res = *pLef
54b0: 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 23  t - *pRight.*/.#
54c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
54d0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  UG.static int ft
54e0: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
54f0: 6c 6f 62 28 0a 20 20 46 74 73 35 42 75 66 66 65  lob(.  Fts5Buffe
5500: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
5510: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68         /* Left h
5520: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5530: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  arison */.  cons
5540: 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e  t u8 *pRight, in
5550: 74 20 6e 52 69 67 68 74 20 20 20 20 2f 2a 20 52  t nRight    /* R
5560: 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
5570: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
5580: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
5590: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52  MIN(pLeft->n, nR
55a0: 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73  ight);.  int res
55b0: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d   = memcmp(pLeft-
55c0: 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70  >p, pRight, nCmp
55d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
55e0: 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20  ==0 ? (pLeft->n 
55f0: 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29  - nRight) : res)
5600: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5610: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  * Compare the co
5620: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 77  ntents of the tw
5630: 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e 67 20  o buffers using 
5640: 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65  memcmp(). If one
5650: 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61 20   buffer.** is a 
5660: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
5670: 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69  her, it is consi
5680: 64 65 72 65 64 20 74 68 65 20 6c 65 73 73 65 72  dered the lesser
5690: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d  ..**.** Return -
56a0: 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73  ve if pLeft is s
56b0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67  maller than pRig
56c0: 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72  ht, 0 if they ar
56d0: 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76  e equal or.** +v
56e0: 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73  e if pRight is s
56f0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66  maller than pLef
5700: 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  t. In other word
5710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73  s:.**.**     res
5720: 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69   = *pLeft - *pRi
5730: 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ght.*/.static in
5740: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
5750: 61 72 65 28 46 74 73 35 42 75 66 66 65 72 20 2a  are(Fts5Buffer *
5760: 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66 65  pLeft, Fts5Buffe
5770: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e  r *pRight){.  in
5780: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
5790: 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e  ft->n, pRight->n
57a0: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
57b0: 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20  emcmp(pLeft->p, 
57c0: 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29  pRight->p, nCmp)
57d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
57e0: 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d  =0 ? (pLeft->n -
57f0: 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65   pRight->n) : re
5800: 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  s);.}..#ifdef SQ
5810: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
5820: 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62 43 6f  c int fts5BlobCo
5830: 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75  mpare(.  const u
5840: 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20 6e 4c  8 *pLeft, int nL
5850: 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  eft, .  const u8
5860: 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52   *pRight, int nR
5870: 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  ight.){.  int nC
5880: 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74 2c 20  mp = MIN(nLeft, 
5890: 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72  nRight);.  int r
58a0: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
58b0: 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29  t, pRight, nCmp)
58c0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
58d0: 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20 6e 52  =0 ? (nLeft - nR
58e0: 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  ight) : res);.}.
58f0: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
5900: 6e 74 20 66 74 73 35 4c 65 61 66 46 69 72 73 74  nt fts5LeafFirst
5910: 54 65 72 6d 4f 66 66 28 46 74 73 35 44 61 74 61  TermOff(Fts5Data
5920: 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
5930: 72 65 74 3b 0a 20 20 66 74 73 35 47 65 74 56 61  ret;.  fts5GetVa
5940: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
5950: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
5960: 20 72 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   ret);.  return 
5970: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ret;.}../*.** Cl
5980: 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c  ose the read-onl
5990: 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69  y blob handle, i
59a0: 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f  f it is open..*/
59b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
59c0: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73  5CloseReader(Fts
59d0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
59e0: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
59f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5a00: 20 2a 70 52 65 61 64 65 72 20 3d 20 70 2d 3e 70   *pReader = p->p
5a10: 52 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70  Reader;.    p->p
5a20: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5a30: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
5a40: 73 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  se(pReader);.  }
5a50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  .}.../*.** Retri
5a60: 65 76 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  eve a record fro
5a70: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
5a80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
5a90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
5aa0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
5ab0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74  nd an error left
5ac0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35   in the .** Fts5
5ad0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Index object..*/
5ae0: 0a 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61  .static Fts5Data
5af0: 20 2a 66 74 73 35 44 61 74 61 52 65 61 64 28 46   *fts5DataRead(F
5b00: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
5b10: 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35   iRowid){.  Fts5
5b20: 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Data *pRet = 0;.
5b30: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
5b40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
5b50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5b60: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ;..    if( p->pR
5b70: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f  eader ){.      /
5b80: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20  * This call may 
5b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
5ba0: 4f 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73  ORT if there has
5bb0: 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   been a savepoin
5bc0: 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  t.      ** rollb
5bd0: 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73  ack since it was
5be0: 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74   last used. In t
5bf0: 68 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62  his case a new b
5c00: 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20  lob handle.     
5c10: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
5c20: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
5c30: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d  e3_blob *pBlob =
5c40: 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20   p->pReader;.   
5c50: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5c60: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
5c70: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5c80: 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29  n(pBlob, iRowid)
5c90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5ca0: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b  p->pReader==0 );
5cb0: 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65  .      p->pReade
5cc0: 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20  r = pBlob;.     
5cd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5ce0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  OK ){.        ft
5cf0: 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
5d00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41  if( rc==SQLITE_A
5d20: 42 4f 52 54 20 29 20 72 63 20 3d 20 53 51 4c 49  BORT ) rc = SQLI
5d30: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
5d40: 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 62    /* If the blob
5d50: 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6f   handle is not o
5d60: 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
5d70: 74 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64 20 73  t, open it and s
5d80: 65 65 6b 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  eek .    ** to t
5d90: 68 65 20 72 65 71 75 65 73 74 65 64 20 65 6e 74  he requested ent
5da0: 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ry.  */.    if( 
5db0: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 26 26  p->pReader==0 &&
5dc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5dd0: 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66  {.      Fts5Conf
5de0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
5df0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20  >pConfig;.      
5e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
5e10: 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e  b_open(pConfig->
5e20: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  db, .          p
5e30: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
5e40: 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b  zDataTbl, "block
5e50: 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70  ", iRowid, 0, &p
5e60: 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20  ->pReader.      
5e70: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5e80: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
5e90: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  e sqlite3_blob_o
5ea0: 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
5eb0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 63  _blob_reopen() c
5ec0: 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62 6f 76  alls.    ** abov
5ed0: 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  e returned SQLIT
5ee0: 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72 6e 20  E_ERROR, return 
5ef0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
5f00: 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20 20 20  TAB instead..   
5f10: 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65 61 73   ** All the reas
5f20: 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63 74 69  ons those functi
5f30: 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ons might return
5f40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20   SQLITE_ERROR - 
5f50: 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  missing.    ** t
5f60: 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20 72 6f  able, missing ro
5f70: 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74  w, non-blob/text
5f80: 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e   in block column
5f90: 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20 20 20   - indicate .   
5fa0: 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74 6f 72   ** backing stor
5fb0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  e corruption.  *
5fc0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
5fd0: 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72 63 20  LITE_ERROR ) rc 
5fe0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
5ff0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6010: 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b 20 20 20  u8 *aOut = 0;   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6030: 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20 69 6e  ead blob data in
6040: 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
6050: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  /.      int nByt
6060: 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  e = sqlite3_blob
6070: 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64 65  _bytes(p->pReade
6080: 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41  r);.      int nA
6090: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60a0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60b0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60c0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60d0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c  ite3_malloc(nAll
60f0: 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  oc);.      if( p
6100: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Ret ){.        p
6110: 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b  Ret->nn = nByte;
6120: 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20  .        aOut = 
6130: 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26  pRet->p = (u8*)&
6140: 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  pRet[1];.      }
6150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
6160: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6170: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6180: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6190: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
61a0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
61b0: 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20  ead(p->pReader, 
61c0: 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b  aOut, nByte, 0);
61d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
61e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
61f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6200: 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a  te3_free(pRet);.
6210: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
6220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6230: 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 31 3a         /* TODO1:
6240: 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20 20 20   Fix this */.   
6250: 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c 65 61       pRet->szLea
6260: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
6270: 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  pRet->p[2]);.   
6280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
6290: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 70  ->rc = rc;.    p
62a0: 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a  ->nRead++;.  }..
62b0: 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74 3d    assert( (pRet=
62c0: 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c  =0)==(p->rc!=SQL
62d0: 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74  ITE_OK) );.  ret
62e0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
62f0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6300: 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72  erence to data r
6310: 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62  ecord returned b
6320: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
6330: 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61  l to.** fts5Data
6340: 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Read()..*/.stati
6350: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6360: 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61 20  elease(Fts5Data 
6370: 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69 74  *pData){.  sqlit
6380: 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a  e3_free(pData);.
6390: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
63a0: 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
63b0: 6d 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  mt(.  Fts5Index 
63c0: 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  *p,.  sqlite3_st
63d0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63  mt **ppStmt,.  c
63e0: 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69  har *zSql.){.  i
63f0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
6400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  _OK ){.    if( z
6410: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Sql ){.      p->
6420: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6430: 70 61 72 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66  pare_v2(p->pConf
6440: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
6450: 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , ppStmt, 0);.  
6460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
6470: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6480: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6490: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
64a0: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ql);.  return p-
64b0: 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  >rc;.}.../*.** I
64c0: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
64d0: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
64e0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
64f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6500: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
6510: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6520: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
6530: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
6540: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
6550: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6560: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
6570: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
6580: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6590: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
65a0: 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
65b0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
65c0: 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c  &p->pWriter, sql
65d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
65e0: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
65f0: 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64   INTO '%q'.'%q_d
6600: 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20  ata'(id, block) 
6610: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20  VALUES(?,?)", . 
6620: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6630: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6640: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
6650: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
6660: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  turn;.  }..  sql
6670: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
6680: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
6690: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
66a0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
66b0: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
66c0: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
66d0: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
66e0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
66f0: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6700: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6710: 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  pWriter);.}../*.
6720: 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
6730: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a  ollowing SQL:.**
6740: 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46  .**     DELETE F
6750: 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45  ROM %_data WHERE
6760: 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69   id BETWEEN $iFi
6770: 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a  rst AND $iLast.*
6780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6790: 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73  s5DataDelete(Fts
67a0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
67b0: 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74  First, i64 iLast
67c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ){.  if( p->rc!=
67d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
67e0: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44  rn;..  if( p->pD
67f0: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6800: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73   int rc;.    Fts
6810: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
6820: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
6830: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
6840: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6850: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
6860: 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64   FROM '%q'.'%q_d
6870: 61 74 61 27 20 57 48 45 52 45 20 69 64 3e 3d 3f  ata' WHERE id>=?
6880: 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20   AND id<=?", .  
6890: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
68a0: 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
68b0: 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
68c0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
68d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
68e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
68f0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
6900: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
6910: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
6920: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c  ql, -1, &p->pDel
6930: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
6940: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
6950: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
6960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6970: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
6980: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
6990: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
69a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
69b0: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
69c0: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
69d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
69e0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
69f0: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
6a00: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
6a10: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
6a20: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
6a30: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
6a40: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
6a50: 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74  records associat
6a60: 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20  ed with segment 
6a70: 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69  iSegid..*/.stati
6a80: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6a90: 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73  emoveSegment(Fts
6aa0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
6ab0: 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46  Segid){.  i64 iF
6ac0: 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  irst = FTS5_SEGM
6ad0: 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
6ae0: 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73  , 0);.  i64 iLas
6af0: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
6b00: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c  _ROWID(iSegid+1,
6b10: 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74   0)-1;.  fts5Dat
6b20: 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73  aDelete(p, iFirs
6b30: 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69 66 28  t, iLast);.  if(
6b40: 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 3d   p->pIdxDeleter=
6b50: 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
6b60: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6b70: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6b80: 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
6b90: 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
6ba0: 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74 65 33  Deleter, sqlite3
6bb0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6bc0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6bd0: 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
6be0: 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20  HERE segid=?",. 
6bf0: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6c00: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6c10: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
6c20: 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
6c30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6c40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6c50: 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c  (p->pIdxDeleter,
6c60: 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20   1, iSegid);.   
6c70: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
6c80: 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
6c90: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
6ca0: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
6cb0: 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  Deleter);.  }.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6cd0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
6ce0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
6cf0: 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62  bject returned b
6d00: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a  y an earlier .**
6d10: 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72   call to fts5Str
6d20: 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20  uctureRead() or 
6d30: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
6d40: 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
6d50: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6d60: 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53  ureRelease(Fts5S
6d70: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
6d80: 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63  t){.  if( pStruc
6d90: 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75  t && 0>=(--pStru
6da0: 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20  ct->nRef) ){.   
6db0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
6dc0: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  rt( pStruct->nRe
6dd0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  f==0 );.    for(
6de0: 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
6df0: 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
6e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e10: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
6e20: 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d  [i].aSeg);.    }
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6e40: 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
6e50: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
6e60: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
6e70: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
6e80: 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74 72 75  Struct){.  pStru
6e90: 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f  ct->nRef++;.}../
6ea0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
6eb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
6ec0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
6ed0: 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
6ee0: 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a  d in serialized.
6ef0: 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62  ** form within b
6f00: 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74  uffer pData/nDat
6f10: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  a..**.** The Fts
6f20: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
6f30: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
6f40: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
6f50: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
6f60: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
6f70: 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20  ed by one slot. 
6f80: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6f90: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e  structure conten
6fa0: 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65  ts.** to be more
6fb0: 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a   easily edited..
6fc0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
6fd0: 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74  r occurs, *ppOut
6fe0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
6ff0: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
7000: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75  ror code.** retu
7010: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
7020: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7030: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
7040: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a  ew object and.**
7050: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
7060: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
7070: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
7080: 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  Decode(.  const 
7090: 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  u8 *pData,      
70a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
70b0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  fer containing s
70c0: 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74  erialized struct
70d0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ure */.  int nDa
70e0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
70f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
7100: 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61   of buffer pData
7110: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
7120: 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20  nt *piCookie,   
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7140: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
7150: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
7160: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7170: 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
7180: 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69    /* OUT: Deseri
7190: 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f  alized object */
71a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
71b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
71c0: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76  i = 0;.  int iLv
71d0: 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  l;.  int nLevel 
71e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  = 0;.  int nSegm
71f0: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ent = 0;.  int n
7200: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7220: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
7230: 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74  allocate at pRet
7240: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
7250: 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  ure *pRet = 0;  
7260: 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
7270: 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  re object to ret
7280: 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61  urn */..  /* Gra
7290: 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  b the cookie val
72a0: 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f  ue */.  if( piCo
72b0: 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65  okie ) *piCookie
72c0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
72d0: 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20  t32(pData);.  i 
72e0: 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  = 4;..  /* Read 
72f0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7300: 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73   of levels and s
7310: 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
7320: 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20   start of the.  
7330: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ** structure rec
7340: 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20  ord.  */.  i += 
7350: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7360: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65  &pData[i], nLeve
7370: 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47  l);.  i += fts5G
7380: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7390: 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  a[i], nSegment);
73a0: 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  .  nByte = (.   
73b0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
73c0: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
73e0: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
73f0: 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
7400: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7410: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29  el) * (nLevel-1)
7420: 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20      /* aLevel[] 
7430: 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20  array */.  );.  
7440: 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72 75  pRet = (Fts5Stru
7450: 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74  cture*)sqlite3Ft
7460: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
7470: 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28  , nByte);..  if(
7480: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65   pRet ){.    pRe
7490: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
74a0: 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pRet->nLevel = 
74b0: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74  nLevel;.    pRet
74c0: 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65  ->nSegment = nSe
74d0: 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20  gment;.    i += 
74e0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
74f0: 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20  rint(&pData[i], 
7500: 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75  &pRet->nWriteCou
7510: 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nter);..    for(
7520: 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iLvl=0; rc==SQLI
7530: 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c  TE_OK && iLvl<nL
7540: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
7550: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
7560: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
7570: 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  &pRet->aLevel[iL
7580: 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  vl];.      int n
7590: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74  Total;.      int
75a0: 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69 20   iSeg;..      i 
75b0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
75c0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
75d0: 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20  vl->nMerge);.   
75e0: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
75f0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7600: 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  ], nTotal);.    
7610: 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c    assert( nTotal
7620: 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  >=pLvl->nMerge )
7630: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  ;.      pLvl->aS
7640: 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
7650: 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
7660: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
7670: 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  o(&rc, .        
7680: 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f    nTotal * sizeo
7690: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
76a0: 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 29 3b  egment).      );
76b0: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
76c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76d0: 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20       pLvl->nSeg 
76e0: 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = nTotal;.      
76f0: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
7700: 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b  eg<nTotal; iSeg+
7710: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20  +){.          i 
7720: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7730: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7740: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl->aSeg[iSeg].i
7750: 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
7760: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7770: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7780: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
7790: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
77a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
77b0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
77c0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
77d0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
77e0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
77f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7800: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
7810: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
7820: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
7830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7840: 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
7850: 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  pRet;.  return r
7860: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
7870: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7880: 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
7890: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53  (int *pRc, Fts5S
78a0: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
78b0: 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  uct){.  if( *pRc
78c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
78d0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
78e0: 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
78f0: 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e  truct;.    int n
7900: 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
7910: 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74  >nLevel;.    int
7920: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
7930: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7940: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
7950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7960: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
7970: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
7980: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7990: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29  el) * (nLevel+1)
79a0: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
79b0: 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20  ray */.    );.. 
79c0: 20 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c     pStruct = sql
79d0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74  ite3_realloc(pSt
79e0: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
79f0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7a00: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
7a10: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
7a20: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
7a30: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7a40: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
7a50: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
7a60: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
7a70: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
7a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7a90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7aa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7ab0: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
7ac0: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
7ad0: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
7ae0: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
7af0: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
7b00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7b10: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
7b20: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
7b30: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
7b40: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7b50: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
7b60: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
7b70: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
7b80: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7b90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7ba0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7bb0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
7bc0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7bd0: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7be0: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
7bf0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  .    int nByte;.
7c00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c  .    nByte = (pL
7c10: 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72  vl->nSeg + nExtr
7c20: 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  a) * sizeof(Fts5
7c30: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7c40: 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  );.    aNew = sq
7c50: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c  lite3_realloc(pL
7c60: 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29  vl->aSeg, nByte)
7c70: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29  ;.    if( aNew )
7c80: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73  {.      if( bIns
7c90: 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ert==0 ){.      
7ca0: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
7cb0: 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73  Lvl->nSeg], 0, s
7cc0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7cd0: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
7ce0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtra);.      }el
7cf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7d00: 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nMove = pLvl->nS
7d10: 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
7d20: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7d30: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
7d40: 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d  ve(&aNew[nExtra]
7d50: 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a  , aNew, nMove);.
7d60: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
7d70: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
7d80: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7d90: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
7da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
7db0: 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b  vl->aSeg = aNew;
7dc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7dd0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
7de0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
7df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
7e00: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
7e10: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
7e20: 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
7e30: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
7e40: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
7e50: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
7e60: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
7e70: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
7e80: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  er-allocated as 
7e90: 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75  described for fu
7ea0: 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63  nction fts5Struc
7eb0: 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a  tureDecode() .**
7ec0: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   above..**.** If
7ed0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7ee0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
7ef0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
7f00: 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65  code left in the
7f10: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61  .** Fts5Index ha
7f20: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
7f30: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
7f40: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
7f50: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
7f60: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
7f70: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
7f80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7f90: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
7fa0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
7fb0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7fc0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7fd0: 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  fig;.  Fts5Struc
7fe0: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
7ff0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
8000: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
8010: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8040: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8050: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
8060: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
8070: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8080: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
8090: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
80a0: 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20 54 4f 44  turn 0;.  /* TOD
80b0: 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 68  O: Do we need th
80c0: 69 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d 69  is if the leaf-i
80d0: 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64 65 64  ndex is appended
80e0: 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f  ? Probably... */
80f0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 44 61 74 61  .  memset(&pData
8100: 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20  ->p[pData->nn], 
8110: 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44  0, FTS5_DATA_PAD
8120: 44 49 4e 47 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  DING);.  p->rc =
8130: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8140: 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70  code(pData->p, p
8150: 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b  Data->nn, &iCook
8160: 69 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 69 66  ie, &pRet);.  if
8170: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8180: 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69  OK && pConfig->i
8190: 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20  Cookie!=iCookie 
81a0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
81b0: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
81c0: 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 69 43  Load(pConfig, iC
81d0: 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  ookie);.  }..  f
81e0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
81f0: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Data);.  if( p->
8200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8210: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8220: 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  reRelease(pRet);
8230: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
8240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
8250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8260: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
8270: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69  er of segments i
8280: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
8290: 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 0a  e pStruct. This.
82a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  ** function is o
82b0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 61 73  nly ever used as
82c0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
82d0: 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f  ) conditions..*/
82e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
82f0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
8300: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
8310: 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53  ntSegments(Fts5S
8320: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8330: 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65  t){.  int nSegme
8340: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
8350: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
8360: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
8370: 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75  s */.  if( pStru
8380: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ct ){.    int iL
8390: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
83a0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
83b0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
83c0: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
83d0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
83e0: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
83f0: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
8400: 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53    nSegment += pS
8410: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
8420: 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a  vl].nSeg;.    }.
8430: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53    }..  return nS
8440: 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66  egment;.}.#endif
8450: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
8460: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
8470: 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20  ob(pBuf, pBlob, 
8480: 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20  nBlob) {     \. 
8490: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
84a0: 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75 66 29  >nSpace>=((pBuf)
84b0: 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20  ->n+nBlob) );   
84c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d 65            \.  me
84d0: 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e 70 5b  mcpy(&(pBuf)->p[
84e0: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f  (pBuf)->n], pBlo
84f0: 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20  b, nBlob);      
8500: 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66         \.  (pBuf
8510: 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20  )->n += nBlob;  
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65      \.}..#define
8550: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
8560: 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
8570: 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20 20 20  , iVal) {       
8580: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42           \.  (pB
8590: 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  uf)->n += sqlite
85a0: 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
85b0: 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29  (pBuf)->p[(pBuf)
85c0: 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20  ->n], (iVal));  
85d0: 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75  \.  assert( (pBu
85e0: 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75  f)->nSpace>=(pBu
85f0: 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20 20 20  f)->n );        
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65    \.}.../*.** Se
8620: 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72  rialize and stor
8630: 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65  e the "structure
8640: 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  " record..**.** 
8650: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8660: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
8670: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46  or code in the F
8680: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
8690: 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
86a0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
86b0: 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
86c0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
86d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
86e0: 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
86f0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
8700: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8710: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70  Struct){.  if( p
8720: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8730: 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  ){.    Fts5Buffe
8740: 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  r buf;          
8750: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
8760: 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f  o serialize reco
8770: 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69  rd into */.    i
8780: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87a0: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
87b0: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
87c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69  /.    int iCooki
87d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
87e0: 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61      /* Cookie va
87f0: 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a  lue to store */.
8800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
8810: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  ruct->nSegment==
8820: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
8830: 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75  ntSegments(pStru
8840: 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ct) );.    memse
8850: 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
8860: 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
8870: 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
8880: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69  he current confi
8890: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
88a0: 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d  */.    iCookie =
88b0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f   p->pConfig->iCo
88c0: 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69 43  okie;.    if( iC
88d0: 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69  ookie<0 ) iCooki
88e0: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
88f0: 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 42 75  0==sqlite3Fts5Bu
8900: 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
8910: 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20   &buf, 4+9+9+9) 
8920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8930: 46 74 73 35 50 75 74 33 32 28 62 75 66 2e 70 2c  Fts5Put32(buf.p,
8940: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20   iCookie);.     
8950: 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20   buf.n = 4;.    
8960: 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
8970: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75  AppendVarint(&bu
8980: 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f, pStruct->nLev
8990: 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  el);.      fts5B
89a0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
89b0: 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72  arint(&buf, pStr
89c0: 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a  uct->nSegment);.
89d0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
89e0: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
89f0: 28 26 62 75 66 2c 20 28 69 36 34 29 70 53 74 72  (&buf, (i64)pStr
8a00: 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
8a10: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
8a20: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
8a30: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8a40: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
8a50: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a70: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
8a80: 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
8a90: 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  ts */.      Fts5
8aa0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
8ab0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
8ac0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
8ad0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
8ae0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8af0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
8b00: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66  nMerge);.      f
8b10: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8b20: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8b30: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b  uf, pLvl->nSeg);
8b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8b50: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
8b60: 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20  l->nSeg );..    
8b70: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
8b80: 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
8b90: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
8ba0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8bb0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8bc0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
8bd0: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
8be0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
8bf0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8c00: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8c10: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
8c20: 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  oFirst);.       
8c30: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8c40: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8c50: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8c60: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
8c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8c80: 0a 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69  .    fts5DataWri
8c90: 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43  te(p, FTS5_STRUC
8ca0: 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e  TURE_ROWID, buf.
8cb0: 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66  p, buf.n);.    f
8cc0: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
8cd0: 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  uf);.  }.}..#if 
8ce0: 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  0.static void ft
8cf0: 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
8d00: 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72  (int*,Fts5Buffer
8d10: 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72 65 2a  *,Fts5Structure*
8d20: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  );.static void f
8d30: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
8d40: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  e(const char *zC
8d50: 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75  aption, Fts5Stru
8d60: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8d70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8d80: 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66  TE_OK;.  Fts5Buf
8d90: 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65  fer buf;.  memse
8da0: 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
8db0: 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44  f(buf));.  fts5D
8dc0: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26 72  ebugStructure(&r
8dd0: 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74  c, &buf, pStruct
8de0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
8df0: 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c  out, "%s: %s\n",
8e00: 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70   zCaption, buf.p
8e10: 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  );.  fflush(stdo
8e20: 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ut);.  fts5Buffe
8e30: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23  rFree(&buf);.}.#
8e40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
8e50: 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65  s5PrintStructure
8e60: 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74  (x,y).#endif..st
8e70: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 67  atic int fts5Seg
8e80: 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72  mentSize(Fts5Str
8e90: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8ea0: 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31  Seg){.  return 1
8eb0: 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   + pSeg->pgnoLas
8ec0: 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  t - pSeg->pgnoFi
8ed0: 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rst;.}../*.** Re
8ee0: 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69  turn a copy of i
8ef0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8f00: 53 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20  Struct. Except, 
8f10: 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20  promote as many 
8f20: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20  .** segments as 
8f30: 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65  possible to leve
8f40: 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61  l iPromote. If a
8f50: 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55  n OOM occurs, NU
8f60: 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  LL is .** return
8f70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8f80: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
8f90: 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73  PromoteTo(.  Fts
8fa0: 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74  5Index *p,.  int
8fb0: 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74   iPromote,.  int
8fc0: 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74   szPromote,.  Ft
8fd0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
8fe0: 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c  ruct.){.  int il
8ff0: 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75  , is;.  Fts5Stru
9000: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74  ctureLevel *pOut
9010: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9020: 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a  vel[iPromote];..
9030: 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72    if( pOut->nMer
9040: 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ge==0 ){.    for
9050: 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20  (il=iPromote+1; 
9060: 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  il<pStruct->nLev
9070: 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20  el; il++){.     
9080: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9090: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
90a0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d  ruct->aLevel[il]
90b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
90c0: 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72  ->nMerge ) retur
90d0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d  n;.      for(is=
90e0: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73  pLvl->nSeg-1; is
90f0: 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20  >=0; is--){.    
9100: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73      int sz = fts
9110: 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c  5SegmentSize(&pL
9120: 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20  vl->aSeg[is]);. 
9130: 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a         if( sz>sz
9140: 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e  Promote ) return
9150: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  ;.        fts5St
9160: 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
9170: 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
9180: 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c  ct, iPromote, 1,
9190: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
91a0: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
91b0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
91c0: 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pOut->aSeg, &pLv
91d0: 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a  l->aSeg[is], siz
91e0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
91f0: 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20  eSegment));.    
9200: 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b      pOut->nSeg++
9210: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
9220: 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nSeg--;.      }.
9230: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9240: 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74  ** A new segment
9250: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77   has just been w
9260: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
9270: 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74  iLvl of index st
9280: 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75  ructure.** pStru
9290: 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
92a0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  n determines if 
92b0: 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f  any segments sho
92c0: 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a  uld be promoted.
92d0: 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20  ** as a result. 
92e0: 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  Segments are pro
92f0: 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65  moted in two sce
9300: 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
9310: 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  a) If the segmen
9320: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
9330: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  s smaller than o
9340: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
9350: 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68  nts.**      with
9360: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
9370: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c  populated level,
9380: 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20   it is promoted 
9390: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  to the previous.
93a0: 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65  **      populate
93b0: 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20  d level..**.**  
93c0: 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   b) If the segme
93d0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
93e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
93f0: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
9400: 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65  t on.**      the
9410: 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20   next populated 
9420: 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74  level, then that
9430: 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e   segment, and an
9440: 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74  y other adjacent
9450: 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74  .**      segment
9460: 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
9470: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
9480: 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65   one just writte
9490: 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20  n, are .**      
94a0: 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a  promoted. .**.**
94b0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
94c0: 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  segments are pro
94d0: 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63  moted, the struc
94e0: 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75  ture object is u
94f0: 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66  pdated.** to ref
9500: 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  lect this..*/.st
9510: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
9520: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a  ructurePromote(.
9530: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
9560: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
9570: 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20  t iLvl,         
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9590: 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73   Index level jus
95a0: 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46  t updated */.  F
95b0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
95c0: 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f  truct          /
95d0: 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
95e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  e */.){.  if( p-
95f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9600: 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a  {.    int iTst;.
9610: 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65      int iPromote
9620: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73   = -1;.    int s
9630: 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20  zPromote = 0;   
9640: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d           /* Prom
9650: 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69  ote anything thi
9660: 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65  s size or smalle
9670: 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72  r */.    Fts5Str
9680: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
9690: 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e  Seg;   /* Segmen
96a0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  t just written *
96b0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b  /.    int szSeg;
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
96e0: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
96f0: 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ten */.    int n
9700: 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  Seg = pStruct->a
9710: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
9720: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3d  ;..    if( nSeg=
9730: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
9740: 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
9750: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
9760: 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg[pStruct->aLe
9770: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31  vel[iLvl].nSeg-1
9780: 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20 28  ];.    szSeg = (
9790: 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  1 + pSeg->pgnoLa
97a0: 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  st - pSeg->pgnoF
97b0: 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  irst);..    /* C
97c0: 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69  heck for conditi
97d0: 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f  on (a) */.    fo
97e0: 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69  r(iTst=iLvl-1; i
97f0: 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75 63  Tst>=0 && pStruc
9800: 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e  t->aLevel[iTst].
9810: 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29  nSeg==0; iTst--)
9820: 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d  ;.    if( iTst>=
9830: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
9840: 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61  ;.      int szMa
9850: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73  x = 0;.      Fts
9860: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9870: 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74  *pTst = &pStruct
9880: 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a  ->aLevel[iTst];.
9890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
98a0: 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b  st->nMerge==0 );
98b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
98c0: 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b  i<pTst->nSeg; i+
98d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
98e0: 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b  sz = pTst->aSeg[
98f0: 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54  i].pgnoLast - pT
9900: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
9910: 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20  First + 1;.     
9920: 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20     if( sz>szMax 
9930: 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20  ) szMax = sz;.  
9940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9950: 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a  szMax>=szSeg ){.
9960: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69          /* Condi
9970: 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65  tion (a) is true
9980: 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65  . Promote the ne
9990: 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20  west segment on 
99a0: 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a  level .        *
99b0: 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20  * iLvl to level 
99c0: 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  iTst.  */.      
99d0: 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73    iPromote = iTs
99e0: 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f  t;.        szPro
99f0: 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20  mote = szMax;.  
9a00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9a10: 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e   /* If condition
9a20: 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c   (a) is not met,
9a30: 20 61 73 73 75 6d 65 20 28 62 29 20 69 73 20 74   assume (b) is t
9a40: 72 75 65 2e 20 53 74 72 75 63 74 75 72 65 50 72  rue. StructurePr
9a50: 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a  omoteTo().    **
9a60: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69   is a no-op if i
9a70: 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20  t is not.  */.  
9a80: 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30    if( iPromote<0
9a90: 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f   ){.      iPromo
9aa0: 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  te = iLvl;.     
9ab0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53   szPromote = szS
9ac0: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  eg;.    }.    ft
9ad0: 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
9ae0: 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65  teTo(p, iPromote
9af0: 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74  , szPromote, pSt
9b00: 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ruct);.  }.}.../
9b10: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
9b20: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
9b30: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
9b40: 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65 6e  ument. If the en
9b50: 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63  d of the .** doc
9b60: 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20  list-index page 
9b70: 69 73 20 72 65 61 63 68 65 64 2c 20 72 65 74 75  is reached, retu
9b80: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
9b90: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
9ba0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73 35  lidxLvlNext(Fts5
9bb0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b  DlidxLvl *pLvl){
9bc0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
9bd0: 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61  ta = pLvl->pData
9be0: 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69  ;..  if( pLvl->i
9bf0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Off==0 ){.    as
9c00: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66  sert( pLvl->bEof
9c10: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  ==0 );.    pLvl-
9c20: 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20 70  >iOff = 1;.    p
9c30: 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  Lvl->iOff += fts
9c40: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
9c50: 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d  ata->p[1], pLvl-
9c60: 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  >iLeafPgno);.   
9c70: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
9c80: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
9c90: 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66  ata->p[pLvl->iOf
9ca0: 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d  f], (u64*)&pLvl-
9cb0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c  >iRowid);.    pL
9cc0: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20  vl->iFirstOff = 
9cd0: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65  pLvl->iOff;.  }e
9ce0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  lse{.    int iOf
9cf0: 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d  f;.    for(iOff=
9d00: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66  pLvl->iOff; iOff
9d10: 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66  <pData->nn; iOff
9d20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
9d30: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20  Data->p[iOff] ) 
9d40: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20  break; .    }.. 
9d50: 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74     if( iOff<pDat
9d60: 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69  a->nn ){.      i
9d70: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  64 iVal;.      p
9d80: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b  Lvl->iLeafPgno +
9d90: 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e  = (iOff - pLvl->
9da0: 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 20  iOff) + 1;.     
9db0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
9dc0: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
9dd0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
9de0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  Val);.      pLvl
9df0: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c  ->iRowid += iVal
9e00: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f  ;.      pLvl->iO
9e10: 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d  ff = iOff;.    }
9e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c  else{.      pLvl
9e30: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
9e40: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9e50: 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f  pLvl->bEof;.}../
9e60: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
9e70: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
9e80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
9e90: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
9ea0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
9eb0: 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64 65  erNextR(Fts5Inde
9ec0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
9ed0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
9ee0: 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69  iLvl){.  Fts5Dli
9ef0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
9f00: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d  Iter->aLvl[iLvl]
9f10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
9f20: 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b  l<pIter->nLvl );
9f30: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
9f40: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b  LvlNext(pLvl) ){
9f50: 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31  .    if( (iLvl+1
9f60: 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  ) < pIter->nLvl 
9f70: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
9f80: 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70  dxIterNextR(p, p
9f90: 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20  Iter, iLvl+1);. 
9fa0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d       if( pLvl[1]
9fb0: 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
9fc0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
9fd0: 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
9fe0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
9ff0: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
a000: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
a010: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  .        pLvl->p
a020: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
a030: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
a040: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
a050: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
a060: 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31  id, iLvl, pLvl[1
a070: 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ].iLeafPgno).   
a080: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
a090: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
a0a0: 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ) fts5DlidxLvlNe
a0b0: 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20  xt(pLvl);.      
a0c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
a0d0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
a0e0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61  l[0].bEof;.}.sta
a0f0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a100: 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  xIterNext(Fts5In
a110: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a120: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
a130: 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64   return fts5Dlid
a140: 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49  xIterNextR(p, pI
a150: 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter, 0);.}../*.*
a160: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 70  * The iterator p
a170: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
a180: 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  st argument has 
a190: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
a1a0: 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20 66  elds set.** as f
a1b0: 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  ollows. This fun
a1c0: 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74 68  ction sets up th
a1d0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 74  e rest of the it
a1e0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
a1f0: 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  t.** points to t
a200: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
a210: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  n the doclist-in
a220: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61  dex..**.**   pDa
a230: 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74  ta:.**     point
a240: 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e  er to doclist-in
a250: 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a  dex record, .**.
a260: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
a270: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
a280: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
a290: 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
a2a0: 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69  ber the.** docli
a2b0: 73 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  st is associated
a2c0: 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20 66   with (the one f
a2d0: 65 61 74 75 72 69 6e 67 20 74 68 65 20 74 65 72  eaturing the ter
a2e0: 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  m)..*/.static in
a2f0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46  t fts5DlidxIterF
a300: 69 72 73 74 28 46 74 73 35 44 6c 69 64 78 49 74  irst(Fts5DlidxIt
a310: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
a320: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
a330: 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
a340: 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69  ++){.    fts5Dli
a350: 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65 72  dxLvlNext(&pIter
a360: 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a  ->aLvl[i]);.  }.
a370: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
a380: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
a390: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
a3a0: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
a3b0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a3c0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a3d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  ){.  return p->r
a3e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a3f0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
a400: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  Eof;.}..static v
a410: 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
a420: 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78 20  rLast(Fts5Index 
a430: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
a440: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
a450: 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   i;..  /* Advanc
a460: 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f 20  e each level to 
a470: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 6f  the last entry o
a480: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
a490: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65 72  */.  for(i=pIter
a4a0: 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d  ->nLvl-1; p->rc=
a4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e  =SQLITE_OK && i>
a4c0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74  =0; i--){.    Ft
a4d0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a4e0: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
a4f0: 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66  i];.    while( f
a500: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a510: 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pLvl)==0 );.    
a520: 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a  pLvl->bEof = 0;.
a530: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
a540: 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c        Fts5DlidxL
a550: 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c  vl *pChild = &pL
a560: 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74  vl[-1];.      ft
a570: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 43  s5DataRelease(pC
a580: 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20  hild->pData);.  
a590: 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69 6c      memset(pChil
a5a0: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  d, 0, sizeof(Fts
a5b0: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
a5c0: 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74 61     pChild->pData
a5d0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
a5e0: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
a5f0: 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
a600: 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d  Iter->iSegid, i-
a610: 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67  1, pLvl->iLeafPg
a620: 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  no).      );.   
a630: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a640: 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
a650: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
a660: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
a670: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
a680: 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  try..*/.static i
a690: 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50  nt fts5DlidxLvlP
a6a0: 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  rev(Fts5DlidxLvl
a6b0: 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69   *pLvl){.  int i
a6c0: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a6d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76  ;..  assert( pLv
a6e0: 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  l->bEof==0 );.  
a6f0: 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e  if( iOff<=pLvl->
a700: 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20  iFirstOff ){.   
a710: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b   pLvl->bEof = 1;
a720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
a730: 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74   *a = pLvl->pDat
a740: 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56  a->p;.    i64 iV
a750: 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  al;.    int iLim
a760: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a  it;.    int ii;.
a770: 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20      int nZero = 
a780: 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  0;..    /* Curre
a790: 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73  ntly iOff points
a7a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
a7b0: 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20  te of a varint. 
a7c0: 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20  This block .    
a7d0: 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f  ** decrements iO
a7e0: 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  ff until it poin
a7f0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
a800: 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65 76  byte of the prev
a810: 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72  ious .    ** var
a820: 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65  int. Taking care
a830: 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79   not to read any
a840: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
a850: 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20  s that occur.   
a860: 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62   ** before the b
a870: 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e  uffer in memory.
a880: 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20    */.    iLimit 
a890: 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66  = (iOff>9 ? iOff
a8a0: 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72  -9 : 0);.    for
a8b0: 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c  (iOff--; iOff>iL
a8c0: 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20  imit; iOff--){. 
a8d0: 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66       if( (a[iOff
a8e0: 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29  -1] & 0x80)==0 )
a8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
a900: 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
a910: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
a920: 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76  )&iVal);.    pLv
a930: 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56 61  l->iRowid -= iVa
a940: 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65  l;.    pLvl->iLe
a950: 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f  afPgno--;..    /
a960: 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73  * Skip backwards
a970: 20 70 61 73 74 20 61 6e 79 20 30 78 30 30 20 76   past any 0x00 v
a980: 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66  arints. */.    f
a990: 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69  or(ii=iOff-1; ii
a9a0: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
a9b0: 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30  f && a[ii]==0x00
a9c0: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e  ; ii--){.      n
a9d0: 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Zero++;.    }.  
a9e0: 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e    if( ii>=pLvl->
a9f0: 69 46 69 72 73 74 4f 66 66 20 26 26 20 28 61 5b  iFirstOff && (a[
aa00: 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a 20  ii] & 0x80) ){. 
aa10: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
aa20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66   immediately bef
aa30: 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30 78 30  ore the last 0x0
aa40: 30 20 62 79 74 65 20 68 61 73 20 74 68 65 20 30  0 byte has the 0
aa50: 78 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a 2a  x80 bit.      **
aa60: 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61 73   set. So the las
aa70: 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20 61  t 0x00 is only a
aa80: 20 76 61 72 69 6e 74 20 30 20 69 66 20 74 68 65   varint 0 if the
aa90: 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30 78  re are 8 more 0x
aaa0: 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  80.      ** byte
aab0: 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20  s before a[ii]. 
aac0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a 65  */.      int bZe
aad0: 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ro = 0;         
aae0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aaf0: 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74 73  last 0x00 counts
ab00: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 69   */.      if( (i
ab10: 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  i-8)>=pLvl->iFir
ab20: 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  stOff ){.       
ab30: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
ab40: 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26  for(j=1; j<=8 &&
ab50: 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30   (a[ii-j] & 0x80
ab60: 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  ); j++);.       
ab70: 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a   bZero = (j>8);.
ab80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ab90: 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65  ( bZero==0 ) nZe
aba0: 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ro--;.    }.    
abb0: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  pLvl->iLeafPgno 
abc0: 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c  -= nZero;.    pL
abd0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20  vl->iOff = iOff 
abe0: 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20  - nZero;.  }..  
abf0: 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f  return pLvl->bEo
ac00: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  f;.}..static int
ac10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
ac20: 65 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70  evR(Fts5Index *p
ac30: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ac40: 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c  *pIter, int iLvl
ac50: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  ){.  Fts5DlidxLv
ac60: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
ac70: 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20  ->aLvl[iLvl];.. 
ac80: 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49   assert( iLvl<pI
ac90: 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69  ter->nLvl );.  i
aca0: 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50  f( fts5DlidxLvlP
acb0: 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20  rev(pLvl) ){.   
acc0: 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20   if( (iLvl+1) < 
acd0: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20  pIter->nLvl ){. 
ace0: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
acf0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
ad00: 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20  , iLvl+1);.     
ad10: 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f   if( pLvl[1].bEo
ad20: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
ad30: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ad40: 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pLvl->pData);.  
ad50: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
ad60: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
ad70: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
ad80: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
ad90: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
ada0: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
adb0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
adc0: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
add0: 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c  iLvl, pLvl[1].iL
ade0: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  eafPgno).       
adf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ae00: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20  pLvl->pData ){. 
ae10: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
ae20: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
ae30: 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  (pLvl)==0 );.   
ae40: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f         pLvl->bEo
ae50: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  f = 0;.        }
ae60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ae70: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
ae80: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ae90: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
aea0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aeb0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
aec0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
aed0: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
aee0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aef0: 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  R(p, pIter, 0);.
af00: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
af10: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74  doclist-index it
af20: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c  erator object al
af30: 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44  located by fts5D
af40: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a  lidxIterInit()..
af50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
af60: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
af70: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
af80: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
af90: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ter ){.    int i
afa0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
afb0: 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b  <pIter->nLvl; i+
afc0: 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
afd0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
afe0: 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b  >aLvl[i].pData);
aff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b000: 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
b010: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
b020: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74 73  s5DlidxIter *fts
b030: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a  5DlidxIterInit(.
b040: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e    /* Fts5 Backen
b070: 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
b080: 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  hin */.  int bRe
b090: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
b0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
b0b0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53   for ORDER BY AS
b0c0: 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  C */.  int iSegi
b0d0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
b0e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
b0f0: 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  t id */.  int iL
b100: 65 61 66 50 67 20 20 20 20 20 20 20 20 20 20 20  eafPg           
b110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
b120: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  f page number to
b130: 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20   load dlidx for 
b140: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  */.){.  Fts5Dlid
b150: 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  xIter *pIter = 0
b160: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
b170: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
b180: 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
b190: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
b1a0: 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
b1b0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
b1c0: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
b1d0: 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46  ) + i * sizeof(F
b1e0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20  ts5DlidxLvl);.  
b1f0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
b200: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77  *pNew;..    pNew
b210: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
b220: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
b230: 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74 65 29  oc(pIter, nByte)
b240: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
b250: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
b260: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
b270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b280: 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
b290: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
b2a0: 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65 61 66  iSegid, i, iLeaf
b2b0: 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73 35 44  Pg);.      Fts5D
b2c0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b2d0: 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  &pNew->aLvl[i];.
b2e0: 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 4e        pIter = pN
b2f0: 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  ew;.      memset
b300: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
b310: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
b320: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
b330: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b340: 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  d(p, iRowid);.  
b350: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44      if( pLvl->pD
b360: 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44  ata && (pLvl->pD
b370: 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30  ata->p[0] & 0x00
b380: 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  01)==0 ){.      
b390: 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20    bDone = 1;.   
b3a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
b3b0: 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20  ->nLvl = i+1;.  
b3c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
b3d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
b3e0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53  ){.    pIter->iS
b3f0: 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
b400: 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29     if( bRev==0 )
b410: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
b420: 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65 72  xIterFirst(pIter
b430: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b440: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b450: 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72 29 3b  rLast(p, pIter);
b460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
b470: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
b480: 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  OK ){.    fts5Dl
b490: 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65  idxIterFree(pIte
b4a0: 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20  r);.    pIter = 
b4b0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
b4c0: 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69   pIter;.}..stati
b4d0: 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 49  c i64 fts5DlidxI
b4e0: 74 65 72 52 6f 77 69 64 28 46 74 73 35 44 6c 69  terRowid(Fts5Dli
b4f0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
b500: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b510: 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a  aLvl[0].iRowid;.
b520: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
b530: 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 46  5DlidxIterPgno(F
b540: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b550: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ter){.  return p
b560: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c  Iter->aLvl[0].iL
b570: 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  eafPgno;.}../*.*
b580: 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20  * Load the next 
b590: 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74  leaf page into t
b5a0: 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  he segment itera
b5b0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
b5c0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
b5d0: 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35 49  extPage(.  Fts5I
b5e0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
b5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
b600: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
b610: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
b620: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
b630: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
b640: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f  or to advance to
b650: 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b   next page */.){
b660: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
b670: 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  af;.  Fts5Struct
b680: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
b690: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a   = pIter->pSeg;.
b6a0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
b6b0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
b6c0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
b6d0: 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74  gno++;.  if( pIt
b6e0: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b  er->pNextLeaf ){
b6f0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
b700: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  f = pIter->pNext
b710: 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  Leaf;.    pIter-
b720: 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
b730: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
b740: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53  r->iLeafPgno<=pS
b750: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
b760: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
b770: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
b780: 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35  p, .        FTS5
b790: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
b7a0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74  Seg->iSegid, pIt
b7b0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  er->iLeafPgno). 
b7c0: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
b7d0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b7e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66  = 0;.  }.  pLeaf
b7f0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
b800: 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b  ..  if( pLeaf ){
b810: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
b820: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
b830: 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28 20 66  zLeaf;.    if( f
b840: 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
b850: 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  s(pLeaf) ){.    
b860: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
b870: 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e  oclist = pLeaf->
b880: 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nn+1;.    }else{
b890: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50  .      pIter->iP
b8a0: 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
b8b0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
b8c0: 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67 69  f->p[pIter->iPgi
b8d0: 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20 20  dxOff],.        
b8e0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
b8f0: 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29 3b 0a  oclist.      );.
b900: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b910: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
b920: 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
b930: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61   containing a va
b940: 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72  rint to be inter
b950: 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70  preted as a.** p
b960: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
b970: 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68  e field. Read th
b980: 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74  e varint and ret
b990: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
b9a0: 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
b9b0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
b9c0: 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20  g, set *pnSz to 
b9d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
b9e0: 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74  tes in the posit
b9f0: 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64  ion.** list, and
ba00: 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20   *pbDel to true 
ba10: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
ba20: 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61  ag is set, or fa
ba30: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
ba40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ba50: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
ba60: 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74  const u8 *p, int
ba70: 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44   *pnSz, int *pbD
ba80: 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a  el){.  int nSz;.
ba90: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66    int n = 0;.  f
baa0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
bab0: 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20  32(p, n, nSz);. 
bac0: 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e   assert_nc( nSz>
bad0: 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20  =0 );.  *pnSz = 
bae0: 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20  nSz/2;.  *pbDel 
baf0: 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a  = nSz & 0x0001;.
bb00: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
bb10: 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  *.** Fts5SegIter
bb20: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72  .iLeafOffset cur
bb30: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
bb40: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
bb50: 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  of a.** position
bb60: 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
bb70: 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  . Read the value
bb80: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e   of the field an
bb90: 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e  d store it.** in
bba0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
bbb0: 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ariables:.**.** 
bbc0: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50    Fts5SegIter.nP
bbd0: 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  os.**   Fts5SegI
bbe0: 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c  ter.bDel.**.** L
bbf0: 65 61 76 65 20 46 74 73 35 53 65 67 49 74 65 72  eave Fts5SegIter
bc00: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
bc10: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
bc20: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
bc30: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ** position list
bc40: 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79   content (if any
bc50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
bc60: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
bc70: 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20  dNPos(Fts5Index 
bc80: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
bc90: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
bca0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
bcb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ){.    int iOff 
bcc0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
bcd0: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
bce0: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
bcf0: 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
bd00: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
bd10: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 43  );.    if( p->pC
bd20: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
bd30: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
bd40: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45   ){.      int iE
bd50: 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e  od = MIN(pIter->
bd60: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70  iEndofDoclist, p
bd70: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
bd80: 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65  eaf);.      pIte
bd90: 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20  r->bDel = 0;.   
bda0: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
bdb0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   1;.      if( iO
bdc0: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
bdd0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
bde0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
bdf0: 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a  Iter->bDel = 1;.
be00: 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
be10: 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
be20: 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e  <iEod && pIter->
be30: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d  pLeaf->p[iOff]==
be40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
be50: 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a  Iter->nPos = 1;.
be60: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
be70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
be80: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
be90: 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20  ->nPos = 0;.    
bea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
beb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
bec0: 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74  nt nSz;.      ft
bed0: 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
bee0: 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  2(pIter->pLeaf->
bef0: 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20  p, iOff, nSz);. 
bf00: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c       pIter->bDel
bf10: 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31   = (nSz & 0x0001
bf20: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
bf30: 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20  nPos = nSz>>1;. 
bf40: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
bf50: 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29  pIter->nPos>=0 )
bf60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
bf70: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
bf80: 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74   iOff;.  }.}..st
bf90: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
bfa0: 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 46  gIterLoadRowid(F
bfb0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
bfc0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
bfd0: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
bfe0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
bff0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
c000: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
c010: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
c020: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c030: 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a  et;..  ASSERT_SZ
c040: 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70  LEAF_OK(pIter->p
c050: 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69 4f 66  Leaf);.  if( iOf
c060: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
c070: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  >szLeaf ){.    f
c080: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c090: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
c0a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
c0b0: 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  af==0 ){.      i
c0c0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
c0d0: 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  _OK ) p->rc = FT
c0e0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
c0f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c100: 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
c110: 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65    a = pIter->pLe
c120: 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66  af->p;.  }.  iOf
c130: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
c140: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
c150: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
c160: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74  ->iRowid);.  pIt
c170: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
c180: 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = iOff;.}../*.**
c190: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
c1a0: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
c1b0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
c1c0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
c1d0: 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22  he .** "nSuffix"
c1e0: 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d   field of a term
c1f0: 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  . Function param
c200: 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61  eter nKeep conta
c210: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ins the value.**
c220: 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69 78   of the "nPrefix
c230: 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65 72  " field (if ther
c240: 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69  e was one - it i
c250: 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74 68  s passed 0 if th
c260: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
c270: 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73  st term in the s
c280: 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54  egment)..**.** T
c290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  his function pop
c2a0: 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ulates:.**.**   
c2b0: 46 74 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d  Fts5SegIter.term
c2c0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
c2d0: 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63  r.rowid.**.** ac
c2e0: 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65  cordingly and le
c2f0: 61 76 65 73 20 28 46 74 73 35 53 65 67 49 74 65  aves (Fts5SegIte
c300: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73  r.iLeafOffset) s
c310: 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  et to the conten
c320: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  t of.** the firs
c330: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e  t position list.
c340: 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
c350: 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  st belonging to 
c360: 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74  document .** (Ft
c370: 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64  s5SegIter.iRowid
c380: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
c390: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
c3a0: 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20  dTerm(Fts5Index 
c3b0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
c3c0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65  *pIter, int nKee
c3d0: 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  p){.  u8 *a = pI
c3e0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
c3f0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
c400: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
c410: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
c420: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c430: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
c440: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
c450: 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77   /* Bytes of new
c480: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66   data */..  iOff
c490: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
c4a0: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e  t32(&a[iOff], nN
c4b0: 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65  ew);.  pIter->te
c4c0: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
c4d0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
c4e0: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
c4f0: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
c500: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f   &a[iOff]);.  iO
c510: 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49  ff += nNew;.  pI
c520: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
c530: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70  fset = iOff;.  p
c540: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
c550: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
c560: 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65 72 2d  afPgno;.  pIter-
c570: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
c580: 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65  Off;..  if( pIte
c590: 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d 70 49  r->iPgidxOff>=pI
c5a0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29  ter->pLeaf->nn )
c5b0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
c5c0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
c5d0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
c5e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
c5f0: 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 70 49  t nExtra;.    pI
c600: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b  ter->iPgidxOff +
c610: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
c620: 32 28 26 61 5b 70 49 74 65 72 2d 3e 69 50 67 69  2(&a[pIter->iPgi
c630: 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61 29 3b  dxOff], nExtra);
c640: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
c650: 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 45 78  ofDoclist += nEx
c660: 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  tra;.  }..  fts5
c670: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
c680: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73  (p, pIter);.}..s
c690: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c6a0: 65 67 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  egIterNext(Fts5I
c6b0: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
c6c0: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
c6d0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
c6e0: 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 28  terNext_Reverse(
c6f0: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
c700: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
c710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c720: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e  5SegIterNext_Non
c730: 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  e(Fts5Index*, Ft
c740: 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a  s5SegIter*, int*
c750: 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
c760: 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
c770: 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
c780: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c790: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
c7a0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
c7b0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
c7c0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e  ){.    pIter->xN
c7d0: 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65  ext = fts5SegIte
c7e0: 72 4e 65 78 74 5f 52 65 76 65 72 73 65 3b 0a 20  rNext_Reverse;. 
c7f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43   }else if( p->pC
c800: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
c810: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
c820: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78   ){.    pIter->x
c830: 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74  Next = fts5SegIt
c840: 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d  erNext_None;.  }
c850: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
c860: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
c870: 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a  IterNext;.  }.}.
c880: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
c890: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
c8a0: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
c8b0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
c8c0: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
c8d0: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
c8e0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
c8f0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
c900: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
c910: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
c920: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
c930: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c940: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
c950: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
c960: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c970: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
c980: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
c990: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
c9a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c9b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
c9c0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
c9d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c9e0: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
c9f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
ca20: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
ca30: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
ca40: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
ca50: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
ca60: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
ca70: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
ca80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
ca90: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
caa0: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
cab0: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
cac0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
cad0: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
cae0: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
caf0: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
cb00: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
cb10: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
cb20: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
cb30: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
cb40: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
cb50: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
cb60: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
cb70: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
cb80: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
cb90: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
cba0: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
cbb0: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
cbc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
cbd0: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
cbe0: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
cbf0: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
cc00: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
cc10: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
cc20: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
cc30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
cc40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cc50: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
cc60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
cc70: 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35 53 65  er));.    fts5Se
cc80: 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
cc90: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65  pIter);.    pIte
cca0: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
ccb0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ccc0: 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Pgno = pSeg->pgn
ccd0: 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74  oFirst-1;.    ft
cce0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
ccf0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
cd00: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
cd10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd20: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
cd30: 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73 65  et = 4;.    asse
cd40: 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c  rt_nc( pIter->pL
cd50: 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20  eaf->nn>4 );.   
cd60: 20 61 73 73 65 72 74 28 20 66 74 73 35 4c 65 61   assert( fts5Lea
cd70: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49  fFirstTermOff(pI
cd80: 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29  ter->pLeaf)==4 )
cd90: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  ;.    pIter->iPg
cda0: 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  idxOff = pIter->
cdb0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b  pLeaf->szLeaf+1;
cdc0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
cdd0: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
cde0: 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  r, 0);.    fts5S
cdf0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
ce00: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
ce10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ce20: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
ce30: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
ce40: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
ce50: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
ce60: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
ce70: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
ce80: 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67  _QUERY_DESC flag
ce90: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
cea0: 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61  iterator is in a
ceb0: 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20  n unusual state 
cec0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ced0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68  on is called: th
cee0: 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  e.** Fts5SegIter
cef0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72  .iLeafOffset var
cf00: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
cf10: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
cf20: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
cf30: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
cf40: 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74  size field for t
cf50: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
cf60: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
cf70: 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49  age..** Fts5SegI
cf80: 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74  ter.rowid is set
cf90: 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62  , but nPos and b
cfa0: 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a  Del are not..**.
cfb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cfc0: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74   advances the it
cfd0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
cfe0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
cff0: 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e  last .** relevan
d000: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
d010: 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  age and, if nece
d020: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
d030: 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69  es the .** aRowi
d040: 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52  dOffset[] and iR
d050: 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61  owidOffset varia
d060: 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f  bles. At this po
d070: 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  int the iterator
d080: 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65  .** is in its re
d090: 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74  gular state - Ft
d0a0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
d0b0: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
d0c0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
d0d0: 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
d0e0: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61  n list content a
d0f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
d100: 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  aid rowid..*/.st
d110: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d120: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
d130: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
d140: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
d150: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44  pIter){.  int eD
d160: 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
d170: 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69  ig->eDetail;.  i
d180: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
d190: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
d1a0: 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c  nt i = pIter->iL
d1b0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  eafOffset;.  u8 
d1c0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
d1d0: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77  f->p;.  int iRow
d1e0: 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  idOffset = 0;.. 
d1f0: 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45   if( n>pIter->iE
d200: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
d210: 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45     n = pIter->iE
d220: 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d  ndofDoclist;.  }
d230: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
d240: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
d250: 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  f);.  while( 1 )
d260: 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
d270: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65   = 0;..    if( e
d280: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
d290: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
d2a0: 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20    /* todo */.   
d2b0: 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b     if( i<n && a[
d2c0: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
d2d0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   i++;.        if
d2e0: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
d2f0: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) i++;.      }.
d300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d310: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
d320: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
d330: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50     i += fts5GetP
d340: 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d  oslistSize(&a[i]
d350: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
d360: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50  );.      i += nP
d370: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  os;.    }.    if
d380: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
d390: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
d3a0: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
d3b0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
d3c0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
d3d0: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
d3e0: 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  /* If necessary,
d3f0: 20 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d   grow the pIter-
d400: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20  >aRowidOffset[] 
d410: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66  array. */.    if
d420: 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d  ( iRowidOffset>=
d430: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
d440: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
d450: 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e   nNew = pIter->n
d460: 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b  RowidOffset + 8;
d470: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
d480: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
d490: 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e  _realloc(pIter->
d4a0: 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e  aRowidOffset, nN
d4b0: 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ew*sizeof(int));
d4c0: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
d4d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
d4e0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
d4f0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  EM;.        brea
d500: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d510: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
d520: 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  fset = aNew;.   
d530: 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64     pIter->nRowid
d540: 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  Offset = nNew;. 
d550: 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
d560: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52  >aRowidOffset[iR
d570: 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20  owidOffset++] = 
d580: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d590: 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  et;.    pIter->i
d5a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a  LeafOffset = i;.
d5b0: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f    }.  pIter->iRo
d5c0: 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  widOffset = iRow
d5d0: 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35  idOffset;.  fts5
d5e0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
d5f0: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
d600: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
d610: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
d620: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
d630: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
d640: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d650: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d660: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
d670: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
d680: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
d690: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
d6a0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
d6b0: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
d6c0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d6d0: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
d6e0: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
d6f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d700: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
d710: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
d720: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
d730: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
d740: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d750: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
d760: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
d770: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
d780: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
d790: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e     pIter->pSeg->
d7a0: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
d7b0: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
d7c0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
d7d0: 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c  .      /* iTermL
d7e0: 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65  eafOffset may be
d7f0: 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66   equal to szLeaf
d800: 20 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   if the term is 
d810: 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
d820: 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70  * thing on the p
d830: 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66  age - i.e. the f
d840: 69 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e  irst rowid is on
d850: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
d860: 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  age..      ** In
d870: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d880: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
d890: 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  , this iterator 
d8a0: 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20  is at EOF. */.  
d8b0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
d8c0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
d8d0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
d8e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d8f0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
d900: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
d910: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d920: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a  fOffset<pNew->sz
d930: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
d940: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d950: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
d960: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d970: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
d980: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
d990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d9a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
d9b0: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
d9c0: 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
d9d0: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
d9e0: 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
d9f0: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
da00: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
da10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
da20: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
da30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
da40: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
da50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
da60: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
da70: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
da80: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
da90: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
daa0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
dab0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
dac0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
dad0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  fts5GetVarint(a,
dae0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
daf0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
db00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
db10: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
db20: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
db30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
db40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
db50: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
db60: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
db70: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
db80: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66  eaf->nn+1;.    f
db90: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
dba0: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
dbb0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
dbc0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
dbd0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
dbe0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
dbf0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
dc00: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
dc10: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
dc20: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
dc30: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
dc40: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
dc50: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
dc60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
dc70: 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
dc80: 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ty(Fts5Index *p,
dc90: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
dca0: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
dcb0: 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
dcc0: 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
dcd0: 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
dce0: 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  st];.  return (p
dcf0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
dd00: 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  && pSeg->pLeaf &
dd10: 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29  & pSeg->nPos==0)
dd20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
dd30: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
dd40: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
dd50: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
dd60: 76 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53  version of fts5S
dd70: 65 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20  egIterNext() is 
dd80: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 72 65 76  only used by rev
dd90: 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a  erse iterators..
dda0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ddb0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52  ts5SegIterNext_R
ddc0: 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
ddd0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
dde0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
ddf0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
de00: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
de10: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
de20: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
de30: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
de40: 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f    /* OUT: Set fo
de70: 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  r new term */.){
de80: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
de90: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
dea0: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
deb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
dec0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
ded0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  );.  if( pIter->
dee0: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
def0: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
df00: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
df10: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
df20: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69   int nPos;.    i
df30: 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69  nt bDummy;.    i
df40: 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
df50: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
df60: 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74 65 72  set--;.    pIter
df70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
df80: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
df90: 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69  set[pIter->iRowi
dfa0: 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 66 74  dOffset];.    ft
dfb0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
dfc0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
dfd0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
dfe0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
dff0: 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  if( p->pConfig->
e000: 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
e010: 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
e020: 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74 65 72     iOff += pIter
e030: 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20  ->nPos;.    }.  
e040: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
e050: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
e060: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49  &iDelta);.    pI
e070: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  ter->iRowid -= i
e080: 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Delta;.  }else{.
e090: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
e0a0: 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c  everseNewPage(p,
e0b0: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
e0c0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
e0d0: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
e0e0: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a  the next entry..
e0f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  **.** This versi
e100: 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65  on of fts5SegIte
e110: 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20  rNext() is only 
e120: 75 73 65 64 20 69 66 20 64 65 74 61 69 6c 3d 6e  used if detail=n
e130: 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 69  one and the.** i
e140: 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 61  terator is not a
e150: 20 72 65 76 65 72 73 65 20 64 69 72 65 63 74 69   reverse directi
e160: 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on iterator..*/.
e170: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e180: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
e190: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
e1a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e1b0: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
e1c0: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
e1d0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
e1e0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
e1f0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
e200: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
e210: 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
e220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e230: 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20  UT: Set for new 
e240: 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  term */.){.  int
e250: 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74   iOff;..  assert
e260: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
e270: 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
e280: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
e290: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
e2a0: 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ERSE)==0 );.  as
e2b0: 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
e2c0: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
e2d0: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a  DETAIL_NONE );..
e2e0: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
e2f0: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
e300: 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72  ;.  iOff = pIter
e310: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ->iLeafOffset;..
e320: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
e330: 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 70  is on the next p
e340: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  age */.  if( pIt
e350: 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f 66 66  er->pSeg && iOff
e360: 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
e370: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74  szLeaf ){.    ft
e380: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
e390: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
e3a0: 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20 70 49   if( p->rc || pI
e3b0: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
e3c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49 74 65  return;.    pIte
e3d0: 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  r->iRowid = 0;. 
e3e0: 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 7d     iOff = 4;.  }
e3f0: 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 49 74  ..  if( iOff<pIt
e400: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
e410: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 78 74  t ){.    /* Next
e420: 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65   entry is on the
e430: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f   current page */
e440: 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b  .    i64 iDelta;
e450: 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c  .    iOff += sql
e460: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
e470: 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  t(&pIter->pLeaf-
e480: 3e 70 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74  >p[iOff], &iDelt
e490: 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
e4a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
e4b0: 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  f;.    pIter->iR
e4c0: 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
e4d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 74    }else if( (pIt
e4e0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
e4f0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
e500: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
e510: 70 49 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20  pIter->pSeg ){. 
e520: 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d       int nKeep =
e530: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   0;.      if( iO
e540: 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73  ff!=fts5LeafFirs
e550: 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e  tTermOff(pIter->
e560: 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  pLeaf) ){.      
e570: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
e580: 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
e590: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
e5a0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
e5b0: 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  }.      pIter->i
e5c0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
e5d0: 66 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  f;.      fts5Seg
e5e0: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
e5f0: 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20  pIter, nKeep);. 
e600: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e610: 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20  const u8 *pList 
e620: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  = 0;.      const
e630: 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30   char *zTerm = 0
e640: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73  ;.      int nLis
e650: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
e660: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
e670: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
e680: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
e690: 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48  hScanEntry(p->pH
e6a0: 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c  ash, &zTerm, &pL
e6b0: 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
e6c0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
e6d0: 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e   ) goto next_non
e6e0: 65 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70 49 74  e_eof;.      pIt
e6f0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28  er->pLeaf->p = (
e700: 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20  u8*)pList;.     
e710: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
e720: 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  n = nList;.     
e730: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
e740: 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20  zLeaf = nList;. 
e750: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
e760: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73  ofDoclist = nLis
e770: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
e780: 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
e790: 2d 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74 65 72  ->rc,&pIter->ter
e7a0: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  m, (int)strlen(z
e7b0: 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72  Term), (u8*)zTer
e7c0: 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  m);.      pIter-
e7d0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
e7e0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69  ts5GetVarint(pLi
e7f0: 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  st, (u64*)&pIter
e800: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  ->iRowid);.    }
e810: 0a 0a 20 20 20 20 69 66 28 20 70 62 4e 65 77 54  ..    if( pbNewT
e820: 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d  erm ) *pbNewTerm
e830: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
e840: 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e     goto next_non
e850: 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74  e_eof;.  }..  ft
e860: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
e870: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  s(p, pIter);..  
e880: 72 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f  return;. next_no
e890: 6e 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44 61  ne_eof:.  fts5Da
e8a0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
e8b0: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
e8c0: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a  ->pLeaf = 0;.}..
e8d0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  ./*.** Advance i
e8e0: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f  terator pIter to
e8f0: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
e900: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
e910: 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
e920: 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
e930: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
e940: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74  e error code. It
e950: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73   .** is not cons
e960: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
e970: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
e980: 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20  reaches EOF. If 
e990: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
e9a0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
e9b0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
e9c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
e9d0: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
e9e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e9f0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20  s5SegIterNext(. 
ea00: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
ea30: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
ea40: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea60: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
ea70: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nce */.  int *pb
ea80: 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20  NewTerm         
ea90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
eaa0: 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72   Set for new ter
eab0: 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61  m */.){.  Fts5Da
eac0: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
ead0: 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20  r->pLeaf;.  int 
eae0: 69 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77  iOff;.  int bNew
eaf0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Term = 0;.  int 
eb00: 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 61 73  nKeep = 0;..  as
eb10: 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d  sert( pbNewTerm=
eb20: 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d  =0 || *pbNewTerm
eb30: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
eb40: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
eb50: 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
eb60: 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20  L_NONE );..  /* 
eb70: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 65  Search for the e
eb80: 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  nd of the positi
eb90: 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20 74  on list within t
eba0: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
ebb0: 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 70 4c   */.  u8 *a = pL
ebc0: 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 6e 20  eaf->p;.  int n 
ebd0: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
ebe0: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
ebf0: 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 69  F_OK(pLeaf);.  i
ec00: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
ec10: 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72  afOffset + pIter
ec20: 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28 20 69  ->nPos;..  if( i
ec30: 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f 2a 20  Off<n ){.    /* 
ec40: 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  The next entry i
ec50: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
ec60: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
ec70: 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d 70  sert_nc( iOff<=p
ec80: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ec90: 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ist );.    if( i
eca0: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45 6e 64  Off>=pIter->iEnd
ecb0: 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  ofDoclist ){.   
ecc0: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
ecd0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 21  .      if( iOff!
ece0: 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65  =fts5LeafFirstTe
ecf0: 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a  rmOff(pLeaf) ){.
ed00: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
ed10: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
ed20: 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  &a[iOff], nKeep)
ed30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ed40: 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20 69  lse{.      u64 i
ed50: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66  Delta;.      iOf
ed60: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
ed70: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
ed80: 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20  f], &iDelta);.  
ed90: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
eda0: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
edb0: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 44     assert_nc( iD
edc0: 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  elta>0 );.    }.
edd0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ede0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
edf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
ee00: 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  r->pSeg==0 ){.  
ee10: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
ee20: 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  t = 0;.    const
ee30: 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30   char *zTerm = 0
ee40: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20  ;.    int nList 
ee50: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
ee60: 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
ee70: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
ee80: 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65 77 54  ETERM) || pbNewT
ee90: 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20 30  erm );.    if( 0
eea0: 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ==(pIter->flags 
eeb0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
eec0: 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20  NETERM) ){.     
eed0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
eee0: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
eef0: 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
ef00: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
ef10: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
ef20: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
ef30: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
ef40: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
ef50: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
ef60: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
ef70: 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  af);.      pIter
ef80: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
ef90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
efa0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20  ter->pLeaf->p = 
efb0: 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20  (u8*)pList;.    
efc0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
efd0: 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  nn = nList;.    
efe0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
eff0: 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a  szLeaf = nList;.
f000: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
f010: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69  dofDoclist = nLi
f020: 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  st+1;.      sqli
f030: 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
f040: 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
f050: 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c  >term, (int)strl
f060: 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20  en(zTerm),.     
f070: 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72 6d 29       (u8*)zTerm)
f080: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f090: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
f0a0: 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74  5GetVarint(pList
f0b0: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
f0c0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 2a  iRowid);.      *
f0d0: 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20  pbNewTerm = 1;. 
f0e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
f0f0: 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20    iOff = 0;.    
f100: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73  /* Next entry is
f110: 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72   not on the curr
f120: 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ent page */.    
f130: 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29  while( iOff==0 )
f140: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
f150: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
f160: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70 4c 65  Iter);.      pLe
f170: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
f180: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  f;.      if( pLe
f190: 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  af==0 ) break;. 
f1a0: 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45       ASSERT_SZLE
f1b0: 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
f1c0: 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20      if( (iOff = 
f1d0: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
f1e0: 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20 26 26  idOff(pLeaf)) &&
f1f0: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c   iOff<pLeaf->szL
f200: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  eaf ){.        i
f210: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
f220: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
f230: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
f240: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
f250: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  d);.        pIte
f260: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f270: 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20   iOff;..        
f280: 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c  if( pLeaf->nn>pL
f290: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
f2a0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
f2b0: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61  iPgidxOff = pLea
f2c0: 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35  f->szLeaf + fts5
f2d0: 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20  GetVarint32(.   
f2e0: 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65 61             &pLea
f2f0: 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65  f->p[pLeaf->szLe
f300: 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e 64  af], pIter->iEnd
f310: 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20  ofDoclist.      
f320: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f330: 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a 20 20     }..      }.  
f340: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65      else if( pLe
f350: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
f360: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
f370: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
f380: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
f390: 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   + fts5GetVarint
f3a0: 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  32(.            
f3b0: 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d  &pLeaf->p[pLeaf-
f3c0: 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66 66 0a 20  >szLeaf], iOff. 
f3d0: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
f3e0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
f3f0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f400: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
f410: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
f420: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 62 4e  iOff;.        bN
f430: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
f440: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
f450: 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  _nc( iOff<pLeaf-
f460: 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  >szLeaf );.     
f470: 20 69 66 28 20 69 4f 66 66 3e 70 4c 65 61 66 2d   if( iOff>pLeaf-
f480: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
f490: 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
f4a0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
f4b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
f4c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f4d0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74   Check if the it
f4e0: 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74  erator is now at
f4f0: 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74   EOF. If so, ret
f500: 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
f510: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
f520: 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4e 65 77   ){.    if( bNew
f530: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66  Term ){.      if
f540: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
f550: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
f560: 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20  ETERM ){.       
f570: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f580: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
f590: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
f5a0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
f5b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
f5c0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
f5d0: 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65  rm(p, pIter, nKe
f5e0: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ep);.        fts
f5f0: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
f600: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
f610: 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
f620: 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
f630: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
f640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
f650: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
f660: 75 6c 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63  uld be done by c
f670: 61 6c 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74  alling fts5SegIt
f680: 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75  erLoadNPos(). Bu
f690: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  t.      ** this 
f6a0: 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75  block is particu
f6b0: 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63  larly performanc
f6c0: 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65  e critical, so e
f6d0: 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
f6e0: 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  ** code is inlin
f6f0: 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ed. .      **.  
f700: 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77      ** Later: Sw
f710: 69 74 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66  itched back to f
f720: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
f730: 6f 73 28 29 20 62 65 63 61 75 73 65 20 69 74 20  os() because it 
f740: 73 75 70 70 6f 72 74 73 0a 20 20 20 20 20 20 2a  supports.      *
f750: 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f  * detail=none mo
f760: 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20  de. Not ideal.. 
f770: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
f780: 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61 73 73  t nSz;.      ass
f790: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
f7a0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
f7b0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
f7c0: 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  32(pIter->pLeaf-
f7d0: 3e 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  >p, pIter->iLeaf
f7e0: 4f 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20  Offset, nSz);.  
f7f0: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
f800: 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29  = (nSz & 0x0001)
f810: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
f820: 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20  Pos = nSz>>1;.  
f830: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
f840: 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b  Iter->nPos>=0 );
f850: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64  .    }.  }.}..#d
f860: 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c  efine SWAPVAL(T,
f870: 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20   a, b) { T tmp; 
f880: 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d  tmp=a; a=b; b=tm
f890: 70 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74  p; }..#define ft
f8a0: 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e  s5IndexSkipVarin
f8b0: 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20  t(a, iOff) {    
f8c0: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20          \.  int 
f8d0: 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20  iEnd = iOff+9;  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
f900: 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b  while( (a[iOff++
f910: 5d 20 26 20 30 78 38 30 29 20 26 26 20 69 4f 66  ] & 0x80) && iOf
f920: 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20  f<iEnd );       
f930: 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  \.}../*.** Itera
f940: 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
f950: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
f960: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
f970: 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73   a doclist. This
f980: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  .** function set
f990: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75  s the iterator u
f9a0: 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74  p so that iterat
f9b0: 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
f9c0: 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  der through.** t
f9d0: 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73  he doclist..*/.s
f9e0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
f9f0: 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74  egIterReverse(Ft
fa00: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
fa10: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
fa20: 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d  .  int eDetail =
fa30: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
fa40: 74 61 69 6c 3b 0a 20 20 46 74 73 35 44 6c 69 64  tail;.  Fts5Dlid
fa50: 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
fa60: 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
fa70: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74   Fts5Data *pLast
fa80: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f   = 0;.  int pgno
fa90: 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Last = 0;..  if(
faa0: 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69   pDlidx ){.    i
fab0: 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
fac0: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
fad0: 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20  .    pgnoLast = 
fae0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
faf0: 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70  o(pDlidx);.    p
fb00: 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52  Last = fts5DataR
fb10: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
fb20: 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
fb30: 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
fb40: 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44  }else{.    Fts5D
fb50: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
fb60: 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20  er->pLeaf;      
fb70: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
fb80: 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20  af data */..    
fb90: 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74  /* Currently, Ft
fba0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
fbb0: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
fbc0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
fbd0: 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  f.    ** positio
fbe0: 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66  n-list content f
fbf0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
fc00: 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70  owid. Back it up
fc10: 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20   so that it.    
fc20: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
fc30: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f   start of the po
fc40: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
fc50: 20 66 69 65 6c 64 2e 20 2a 2f 0a 23 69 66 20 30   field. */.#if 0
fc60: 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c  .    if( eDetail
fc70: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
fc80: 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  NE ){.      pIte
fc90: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2d  r->iLeafOffset -
fca0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
fcb0: 56 61 72 69 6e 74 4c 65 6e 28 70 49 74 65 72 2d  VarintLen(pIter-
fcc0: 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72 2d 3e 62  >nPos*2+pIter->b
fcd0: 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  Del);.    }.#els
fce0: 65 0a 20 20 20 20 69 6e 74 20 69 50 6f 73 6c 69  e.    int iPosli
fcf0: 73 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  st;.    if( pIte
fd00: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
fd10: 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ==pIter->iLeafPg
fd20: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69 50 6f 73  no ){.      iPos
fd30: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 69 54  list = pIter->iT
fd40: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ermLeafOffset;. 
fd50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd60: 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b 0a 20 20  iPoslist = 4;.  
fd70: 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65    }.    fts5Inde
fd80: 78 53 6b 69 70 56 61 72 69 6e 74 28 70 4c 65 61  xSkipVarint(pLea
fd90: 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73 74 29 3b  f->p, iPoslist);
fda0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65  .    assert( eDe
fdb0: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
fdc0: 4c 5f 4e 4f 4e 45 20 7c 7c 20 69 50 6f 73 6c 69  L_NONE || iPosli
fdd0: 73 74 3d 3d 28 0a 20 20 20 20 20 20 20 20 70 49  st==(.        pI
fde0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
fdf0: 20 2d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   - sqlite3Fts5Ge
fe00: 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74 65 72  tVarintLen(pIter
fe10: 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72 2d 3e  ->nPos*2+pIter->
fe20: 62 44 65 6c 29 0a 20 20 20 20 29 29 3b 0a 20 20  bDel).    ));.  
fe30: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
fe40: 66 73 65 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b  fset = iPoslist;
fe50: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
fe60: 49 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  If this conditio
fe70: 6e 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74  n is true then t
fe80: 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  he largest rowid
fe90: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
fea0: 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79  .    ** term may
feb0: 20 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f   not be stored o
fec0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
fed0: 67 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f  ge. So search fo
fee0: 72 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20  rward to.    ** 
fef0: 73 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72  see where said r
ff00: 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20  owid really is. 
ff10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
ff20: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
ff30: 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
ff40: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e  ){.      int pgn
ff50: 6f 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  o;.      Fts5Str
ff60: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
ff70: 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
ff80: 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  g;..      /* The
ff90: 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74   last rowid in t
ffa0: 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e  he doclist may n
ffb0: 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72  ot be on the cur
ffc0: 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63  rent page. Searc
ffd0: 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61  h.      ** forwa
ffe0: 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70  rd to find the p
fff0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
10000 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20  he last rowid.  
10010 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e  */.      for(pgn
10020 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o=pIter->iLeafPg
10030 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20  no+1; !p->rc && 
10040 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f  pgno<=pSeg->pgno
10050 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20  Last; pgno++){. 
10060 20 20 20 20 20 20 20 69 36 34 20 69 41 62 73 20         i64 iAbs 
10070 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
10080 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
10090 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  d, pgno);.      
100a0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
100b0 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
100c0 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20  p, iAbs);.      
100d0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
100e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
100f0 69 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20  id, bTermless;. 
10100 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20           iRowid 
10110 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
10120 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20  owidOff(pNew);. 
10130 20 20 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65           bTermle
10140 73 73 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54  ss = fts5LeafIsT
10150 65 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20  ermless(pNew);. 
10160 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
10170 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
10180 20 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44     SWAPVAL(Fts5D
10190 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73  ata*, pNew, pLas
101a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
101b0 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b  pgnoLast = pgno;
101c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
101d0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
101e0 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
101f0 20 20 20 20 20 20 20 20 69 66 28 20 62 54 65 72          if( bTer
10200 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b  mless==0 ) break
10210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10220 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10230 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20   /* If pLast is 
10240 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
10250 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  nt, then the las
10260 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73  t rowid for this
10270 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69   doclist.  ** li
10280 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63  es on the page c
10290 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
102a0 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
102b0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
102c0 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c   .  ** pIter->iL
102d0 65 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72  eafOffset is alr
102e0 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e  eady set to poin
102f0 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  t to the positio
10300 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a  n-list size.  **
10310 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65   field associate
10320 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
10330 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
10340 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  on the page..  *
10350 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c  *.  ** Or, if pL
10360 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ast is non-NULL,
10370 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
10380 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
10390 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a  ns the last.  **
103a0 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20   rowid. In this 
103b0 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74  case configure t
103c0 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
103d0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
103e0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
103f0 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61  rowid on this pa
10400 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
10410 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Last ){.    int 
10420 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61  iOff;.    fts5Da
10430 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
10440 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
10450 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73  er->pLeaf = pLas
10460 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
10470 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61  eafPgno = pgnoLa
10480 73 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66  st;.    iOff = f
10490 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
104a0 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20  dOff(pLast);.   
104b0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
104c0 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70  Varint(&pLast->p
104d0 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
104e0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
104f0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
10500 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
10510 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
10520 73 54 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29  sTermless(pLast)
10530 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
10540 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
10550 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20   pLast->nn+1;.  
10560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10570 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
10580 69 73 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69  ist = fts5LeafFi
10590 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74  rstTermOff(pLast
105a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20  );.    }..  }.. 
105b0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
105c0 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
105d0 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
105e0 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
105f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
10600 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
10610 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  id of a doclist.
10620 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64  .** There is a d
10630 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73  oclist-index ass
10640 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
10650 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74   final term on t
10660 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70  he current .** p
10670 61 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72  age. If the curr
10680 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20  ent term is the 
10690 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  last term on the
106a0 20 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20   page, load the 
106b0 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
106c0 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20  x from disk and 
106d0 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74  initialize an it
106e0 65 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72  erator at (pIter
106f0 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74  ->pDlidx)..*/.st
10700 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
10710 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46  gIterLoadDlidx(F
10720 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
10730 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
10740 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70  {.  int iSeg = p
10750 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
10760 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d  id;.  int bRev =
10770 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
10780 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
10790 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61  VERSE);.  Fts5Da
107a0 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
107b0 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72  r->pLeaf; /* Cur
107c0 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
107d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  /..  assert( pIt
107e0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
107f0 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
10800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
10810 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29  ter->pDlidx==0 )
10820 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
10830 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
10840 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69  list ends on thi
10850 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f  s page. If it do
10860 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  es, return.  ** 
10870 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f  early without lo
10880 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73  ading the doclis
10890 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62  t-index (as it b
108a0 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66  elongs to a diff
108b0 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e  erent.  ** term.
108c0 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d   */.  if( pIter-
108d0 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d  >iTermLeafPgno==
108e0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
108f0 20 0a 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69   .   && pIter->i
10900 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65  EndofDoclist<pLe
10910 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b  af->szLeaf .  ){
10920 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10930 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  ..  pIter->pDlid
10940 78 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  x = fts5DlidxIte
10950 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69  rInit(p, bRev, i
10960 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72  Seg, pIter->iTer
10970 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f  mLeafPgno);.}../
10980 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
10990 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
109a0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
109b0 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
109c0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20   contains.** no 
109d0 76 61 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63  valid values exc
109e0 65 70 74 20 66 6f 72 20 74 68 65 20 46 74 73 35  ept for the Fts5
109f0 53 65 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65  SegIter.pLeaf me
10a00 6d 62 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54  mber variable. T
10a10 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
10a20 73 65 61 72 63 68 65 73 20 74 68 65 20 6c 65 61  searches the lea
10a30 66 20 70 61 67 65 20 66 6f 72 20 61 20 74 65 72  f page for a ter
10a40 6d 20 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72  m matching (pTer
10a50 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20  m/nTerm)..**.** 
10a60 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  If the specified
10a70 20 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f   term is found o
10a80 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
10a90 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
10aa0 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
10ab0 67 20 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75  g to it. If argu
10ac0 6d 65 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f  ment bGe is zero
10ad0 20 61 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73   and the term is
10ae0 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74   not found,.** t
10af0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
10b00 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
10b10 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47  EOF..**.** If bG
10b20 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  e is non-zero an
10b30 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
10b40 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e  term is not foun
10b50 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69  d, then the.** i
10b60 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
10b70 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
10b80 73 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e  smallest term in
10b90 20 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61   the segment tha
10ba0 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74  t.** is larger t
10bb0 68 61 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  han the specifie
10bc0 64 20 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20  d term, even if 
10bd0 74 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  this term is not
10be0 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
10bf0 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  nt page..*/.stat
10c00 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66  ic void fts5Leaf
10c10 53 65 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  Seek(.  Fts5Inde
10c20 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
10c30 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
10c40 20 61 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20   any error code 
10c50 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47  here */.  int bG
10c60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10c80 65 20 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63  e for a >= searc
10c90 68 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  h */.  Fts5SegIt
10ca0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
10cb0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
10cc0 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20  or to seek */.  
10cd0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
10ce0 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20   int nTerm      
10cf0 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63  /* Term to searc
10d00 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  h for */.){.  in
10d10 74 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20  t iOff;.  const 
10d20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
10d30 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73  Leaf->p;.  int s
10d40 7a 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  zLeaf = pIter->p
10d50 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
10d60 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
10d70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e 74  Leaf->nn;..  int
10d80 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 69   nMatch = 0;.  i
10d90 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
10da0 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  int nNew = 0;.  
10db0 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  int iTermOff;.  
10dc0 69 6e 74 20 69 50 67 69 64 78 3b 20 20 20 20 20  int iPgidx;     
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
10df0 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20  t in pgidx */.  
10e00 69 6e 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d  int bEndOfPage =
10e10 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
10e20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10e30 29 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73  );..  iPgidx = s
10e40 7a 4c 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20  zLeaf;.  iPgidx 
10e50 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
10e60 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69  32(&a[iPgidx], i
10e70 54 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66  TermOff);.  iOff
10e80 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20   = iTermOff;..  
10e90 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
10ea0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
10eb0 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65  ow many new byte
10ec0 73 20 61 72 65 20 69 6e 20 74 68 69 73 20 74 65  s are in this te
10ed0 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61  rm */.    fts5Fa
10ee0 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
10ef0 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20   iOff, nNew);.  
10f00 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74    if( nKeep<nMat
10f10 63 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ch ){.      goto
10f20 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
10f30 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
10f40 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68  t( nKeep>=nMatch
10f50 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65   );.    if( nKee
10f60 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20  p==nMatch ){.   
10f70 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
10f80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
10f90 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c  nCmp = MIN(nNew,
10fa0 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a   nTerm-nMatch);.
10fb0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
10fc0 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCmp; i++){.   
10fd0 20 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b       if( a[iOff+
10fe0 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68  i]!=pTerm[nMatch
10ff0 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  +i] ) break;.   
11000 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63     }.      nMatc
11010 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69  h += i;..      i
11020 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68  f( nTerm==nMatch
11030 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11040 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20  i==nNew ){.     
11050 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
11060 5f 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20  _success;.      
11070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11080 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
11090 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
110a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
110b0 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66   i<nNew && a[iOf
110c0 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63  f+i]>pTerm[nMatc
110d0 68 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  h] ){.        go
110e0 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
110f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11100 0a 20 20 20 20 69 66 28 20 69 50 67 69 64 78 3e  .    if( iPgidx>
11110 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64  =n ){.      bEnd
11120 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  OfPage = 1;.    
11130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11140 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74      iPgidx += ft
11150 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
11160 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29  [iPgidx], nKeep)
11170 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
11180 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66  = nKeep;.    iOf
11190 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
111a0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
111b0 4b 65 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68  Keep field of th
111c0 65 20 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a  e next term. */.
111d0 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
111e0 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c  arint32(a, iOff,
111f0 20 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73   nKeep);.  }.. s
11200 65 61 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20  earch_failed:.  
11210 69 66 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20  if( bGe==0 ){.  
11220 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
11230 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
11240 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
11250 66 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  f = 0;.    retur
11260 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  n;.  }else if( b
11270 45 6e 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20  EndOfPage ){.   
11280 20 64 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35   do {.      fts5
11290 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
112a0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
112b0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
112c0 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  f==0 ) return;. 
112d0 20 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e       a = pIter->
112e0 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20  pLeaf->p;.      
112f0 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65  if( fts5LeafIsTe
11300 72 6d 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c  rmless(pIter->pL
11310 65 61 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eaf)==0 ){.     
11320 20 20 20 69 50 67 69 64 78 20 3d 20 70 49 74 65     iPgidx = pIte
11330 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
11340 3b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78  ;.        iPgidx
11350 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
11360 74 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  t32(&pIter->pLea
11370 66 2d 3e 70 5b 69 50 67 69 64 78 5d 2c 20 69 4f  f->p[iPgidx], iO
11380 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
11390 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e   iOff<4 || iOff>
113a0 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73  =pIter->pLeaf->s
113b0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
113c0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
113d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
113e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
113f0 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20    nKeep = 0;.   
11400 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20         iTermOff 
11410 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
11420 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65    n = pIter->pLe
11430 61 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20  af->nn;.        
11440 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
11450 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
11460 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  f], nNew);.     
11470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11490 20 20 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20    }while( 1 );. 
114a0 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63   }.. search_succ
114b0 65 73 73 3a 0a 0a 20 20 70 49 74 65 72 2d 3e 69  ess:..  pIter->i
114c0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
114d0 66 20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65  f + nNew;.  pIte
114e0 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
114f0 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  et = pIter->iLea
11500 66 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65 72  fOffset;.  pIter
11510 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
11520 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
11530 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65  no;..  fts5Buffe
11540 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
11550 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70  ter->term, nKeep
11560 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73 35  , pTerm);.  fts5
11570 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
11580 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
11590 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b  >term, nNew, &a[
115a0 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69  iOff]);..  if( i
115b0 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20  Pgidx>=n ){.    
115c0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
115d0 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
115e0 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c  eaf->nn+1;.  }el
115f0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74  se{.    int nExt
11600 72 61 3b 0a 20 20 20 20 69 50 67 69 64 78 20 2b  ra;.    iPgidx +
11610 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11620 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45  2(&a[iPgidx], nE
11630 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72  xtra);.    pIter
11640 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
11650 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78  = iTermOff + nEx
11660 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  tra;.  }.  pIter
11670 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 69 50  ->iPgidxOff = iP
11680 67 69 64 78 3b 0a 0a 20 20 66 74 73 35 53 65 67  gidx;..  fts5Seg
11690 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c  IterLoadRowid(p,
116a0 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 53   pIter);.  fts5S
116b0 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
116c0 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
116d0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
116e0 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  e object pIter t
116f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20  o point to term 
11700 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68  pTerm/nTerm with
11710 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53  in segment.** pS
11720 65 67 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  eg. If there is 
11730 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  no such term in 
11740 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69  the index, the i
11750 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
11760 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  o EOF..**.** If 
11770 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11780 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
11790 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
117a0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
117b0 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
117c0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
117d0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
117e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
117f0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
11800 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
11810 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53  oid fts5SegIterS
11820 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49  eekInit(.  Fts5I
11830 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
11840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
11850 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  S5 backend */.  
11860 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
11870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11880 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 75 73 65  /* Buffer to use
11890 20 66 6f 72 20 6c 6f 61 64 69 6e 67 20 70 61 67   for loading pag
118a0 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  es */.  const u8
118b0 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
118c0 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
118d0 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20  to seek to */.  
118e0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
11910 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a  NDEX_XXX flags *
11920 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
11930 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
11940 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
11950 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
11960 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11970 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
11980 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
11990 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
119a0 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20   int iPg = 1;.  
119b0 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67 73  int bGe = (flags
119c0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
119d0 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20  RY_SCAN);.  int 
119e0 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20  bDlidx = 0;     
119f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11a00 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20  rue if there is 
11a10 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
11a20 2a 2f 0a 0a 20 20 73 74 61 74 69 63 20 69 6e 74  */..  static int
11a30 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43   nCall = 0;.  nC
11a40 61 6c 6c 2b 2b 3b 0a 0a 20 20 61 73 73 65 72 74  all++;..  assert
11a50 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61  ( bGe==0 || (fla
11a60 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11a70 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b  UERY_DESC)==0 );
11a80 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d  .  assert( pTerm
11a90 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d   && nTerm );.  m
11aa0 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
11ab0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
11ac0 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d  .  pIter->pSeg =
11ad0 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69   pSeg;..  /* Thi
11ae0 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61  s block sets sta
11af0 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20  ck variable iPg 
11b00 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
11b10 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79   number that may
11b20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65  .  ** contain te
11b30 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  rm (pTerm/nTerm)
11b40 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
11b50 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  nt in the segmen
11b60 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
11b70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  IdxSelect==0 ){.
11b80 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
11b90 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
11ba0 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
11bb0 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
11bc0 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  , &p->pIdxSelect
11bd0 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
11be0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  f(.          "SE
11bf0 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27  LECT pgno FROM '
11c00 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45  %q'.'%q_idx' WHE
11c10 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  RE ".          "
11c20 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d  segid=? AND term
11c30 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65 72  <=? ORDER BY ter
11c40 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c  m DESC LIMIT 1",
11c50 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
11c60 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
11c70 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
11c80 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20    }.  if( p->rc 
11c90 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
11ca0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
11cb0 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 70  pIdxSelect, 1, p
11cc0 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20  Seg->iSegid);.  
11cd0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
11ce0 62 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c  b(p->pIdxSelect,
11cf0 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d   2, pTerm, nTerm
11d00 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
11d10 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
11d20 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
11d30 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 20  (p->pIdxSelect) 
11d40 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d  ){.    i64 val =
11d50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11d60 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  int(p->pIdxSelec
11d70 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20 3d  t, 0);.    iPg =
11d80 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a   (int)(val>>1);.
11d90 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76 61      bDlidx = (va
11da0 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 7d  l & 0x0001);.  }
11db0 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
11dc0 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
11dd0 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28 20  Select);..  if( 
11de0 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  iPg<pSeg->pgnoFi
11df0 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d  rst ){.    iPg =
11e00 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
11e10 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30  ;.    bDlidx = 0
11e20 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
11e30 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20  iLeafPgno = iPg 
11e40 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74  - 1;.  fts5SegIt
11e50 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
11e60 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74  ter);..  if( pIt
11e70 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
11e80 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c   fts5LeafSeek(p,
11e90 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65   bGe, pIter, pTe
11ea0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a  rm, nTerm);.  }.
11eb0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
11ec0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d  LITE_OK && bGe==
11ed0 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  0 ){.    pIter->
11ee0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
11ef0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
11f00 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
11f10 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
11f20 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
11f30 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
11f40 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
11f50 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
11f60 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
11f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11f80 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
11f90 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
11fa0 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72  adDlidx(p, pIter
11fb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11fc0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
11fd0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
11fe0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
11ff0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
12000 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
12010 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12020 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
12030 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
12040 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
12050 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
12060 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
12070 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
12080 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12090 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
120a0 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
120b0 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
120c0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
120d0 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
120e0 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
120f0 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
12100 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
12110 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
12120 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
12130 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
12140 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
12150 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
12160 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
12170 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
12180 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
12190 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  TE_OK           
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
121c0 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
121d0 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
12210 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
12220 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12230 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12240 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
12250 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
12260 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
12270 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12280 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12290 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
122a0 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
122b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
122c0 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
122d0 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
122e0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
122f0 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
12300 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
12310 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
12320 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
12330 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
12340 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
12350 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
12360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
12370 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
12380 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
12390 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
123a0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
123b0 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
123c0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
123d0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
123e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
123f0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12410 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
12420 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
12430 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12440 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12450 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
12460 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
12470 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
12480 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
12490 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
124c0 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
124d0 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
124e0 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
124f0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
12500 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
12510 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
12520 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
12530 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
12540 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
12550 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
12560 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
12570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
12580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
12590 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
125a0 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
125b0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
125c0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
125d0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
125e0 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
125f0 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
12600 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
12610 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
12620 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
12630 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
12640 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
12650 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
12660 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c 65   (z ? (int)strle
12670 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
12680 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
12690 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
126a0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
126b0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
126c0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
126d0 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  ery(p->pHash, (c
126e0 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
126f0 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c  , nTerm, &pList,
12700 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20   &nList);.    z 
12710 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d  = pTerm;.    n =
12720 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69   nTerm;.  }..  i
12730 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
12740 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
12750 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
12760 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
12770 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
12780 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
12790 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
127a0 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
127b0 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ata));.    if( p
127c0 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
127d0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d  ;.    pLeaf->p =
127e0 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
127f0 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65   pLeaf->nn = pLe
12800 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
12810 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  st;.    pIter->p
12820 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20  Leaf = pLeaf;.  
12830 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
12840 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
12850 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28  rint(pLeaf->p, (
12860 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
12870 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  wid);.    pIter-
12880 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
12890 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20   pLeaf->nn;..   
128a0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
128b0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
128c0 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  C ){.      pIter
128d0 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
128e0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
128f0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
12900 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
12910 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
12920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
12930 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
12940 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
12950 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65   }.  }..  fts5Se
12960 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
12970 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
12980 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61 74   Zero the iterat
12990 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
129a0 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
129b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
129c0 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
129d0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
129e0 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
129f0 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
12a00 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  rm);.  fts5DataR
12a10 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
12a20 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61 74 61  eaf);.  fts5Data
12a30 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
12a40 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66 74 73  NextLeaf);.  fts
12a50 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
12a60 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
12a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
12a80 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
12a90 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
12aa0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
12ab0 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
12ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
12ad0 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BUG../*.** This 
12ae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
12af0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
12b00 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72 6f  big assert() pro
12b10 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74  cedure implement
12b20 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73  ed by.** fts5Ass
12b30 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
12b40 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20  p(). It ensures 
12b50 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
12b60 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
12b70 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20  .** in *pRes is 
12b80 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
12b90 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
12ba0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
12bb0 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tions of the.** 
12bc0 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  two iterators..*
12bd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
12be0 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
12bf0 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35  onResult(.  Fts5
12c00 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
12c10 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  , .  Fts5SegIter
12c20 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49   *p1,.  Fts5SegI
12c30 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43  ter *p2,.  Fts5C
12c40 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a  Result *pRes.){.
12c50 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20    int i1 = p1 - 
12c60 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69  pIter->aSeg;.  i
12c70 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74  nt i2 = p2 - pIt
12c80 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28  er->aSeg;..  if(
12c90 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32   p1->pLeaf || p2
12ca0 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69  ->pLeaf ){.    i
12cb0 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
12cc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12cd0 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
12ce0 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2 );.    }else i
12cf0 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
12d00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12d10 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
12d20 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1 );.    }else{.
12d30 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d        int nMin =
12d40 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c   MIN(p1->term.n,
12d50 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20   p2->term.n);.  
12d60 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65      int res = me
12d70 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c  mcmp(p1->term.p,
12d80 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69   p2->term.p, nMi
12d90 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  n);.      if( re
12da0 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d  s==0 ) res = p1-
12db0 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65  >term.n - p2->te
12dc0 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28  rm.n;..      if(
12dd0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
12de0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
12df0 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20  >bTermEq==1 );. 
12e00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12e10 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69  1->iRowid!=p2->i
12e20 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
12e30 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
12e40 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
12e50 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
12e60 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20  ? -1 : 1;.      
12e70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
12e80 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
12e90 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rmEq==0 );.     
12ea0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65   }..      if( re
12eb0 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  s<0 ){.        a
12ec0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
12ed0 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20  rst==i1 );.     
12ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12ef0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
12f00 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
12f10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
12f20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12f30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
12f40 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45  unless SQLITE_DE
12f50 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77  BUG is defined w
12f60 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a  hen this module.
12f70 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20  ** is compiled. 
12f80 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
12f90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
12fa0 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73  ssentially an as
12fb0 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
12fc0 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72  ment used to ver
12fd0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ify that the con
12fe0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74  tents of the pIt
12ff0 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72  er->aFirst[] arr
13000 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63  ay.** are correc
13010 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
13020 64 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  d fts5AssertMult
13030 69 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49  iIterSetup(Fts5I
13040 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64  ndex *p, Fts5Ind
13050 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
13060 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
13080 73 35 53 65 67 49 74 65 72 20 2a 70 46 69 72 73  s5SegIter *pFirs
13090 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  t = &pIter->aSeg
130a0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
130b0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
130c0 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73   int i;..    ass
130d0 65 72 74 28 20 28 70 46 69 72 73 74 2d 3e 70 4c  ert( (pFirst->pL
130e0 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e  eaf==0)==pIter->
130f0 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  bEof );..    /* 
13100 43 68 65 63 6b 20 74 68 61 74 20 70 49 74 65 72  Check that pIter
13110 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 69  ->iSwitchRowid i
13120 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
13130 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
13140 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
13150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i++){.      Fts5
13160 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
13170 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
13180 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3d       assert( p1=
13190 3d 70 46 69 72 73 74 20 0a 20 20 20 20 20 20 20  =pFirst .       
131a0 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66      || p1->pLeaf
131b0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
131c0 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  || fts5BufferCom
131d0 70 61 72 65 28 26 70 46 69 72 73 74 2d 3e 74 65  pare(&pFirst->te
131e0 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a  rm, &p1->term) .
131f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31             || p1
13200 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d  ->iRowid==pIter-
13210 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20  >iSwitchRowid.  
13220 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 31 2d           || (p1-
13230 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69  >iRowid<pIter->i
13240 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
13250 74 65 72 2d 3e 62 52 65 76 0a 20 20 20 20 20 20  ter->bRev.      
13260 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
13270 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
13280 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  nSeg; i+=2){.   
13290 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
132a0 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
132b0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  g[i];.      Fts5
132c0 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70  SegIter *p2 = &p
132d0 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b  Iter->aSeg[i+1];
132e0 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75  .      Fts5CResu
132f0 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
13300 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72  r->aFirst[(pIter
13310 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d  ->nSeg + i) / 2]
13320 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ;.      fts5Asse
13330 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
13340 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
13350 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a  , pRes);.    }..
13360 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28      for(i=1; i<(
13370 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29  pIter->nSeg / 2)
13380 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46  ; i+=2){.      F
13390 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d  ts5SegIter *p1 =
133a0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
133b0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
133c0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
133d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
133e0 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
133f0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
13400 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  i*2+1].iFirst ];
13410 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75  .      Fts5CResu
13420 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
13430 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20  r->aFirst[i];.  
13440 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f      fts5AssertCo
13450 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70  mparisonResult(p
13460 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52  Iter, p1, p2, pR
13470 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  es);.    }.  }.}
13480 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13490 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
134a0 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65  terSetup(x,y).#e
134b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74  ndif../*.** Do t
134c0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65  he comparison ne
134d0 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c  cessary to popul
134e0 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  ate pIter->aFirs
134f0 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49  t[iOut]..**.** I
13500 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
13510 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
13520 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
13530 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74   index of an ent
13540 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74  ry.** in the pIt
13550 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  er->aSeg[] array
13560 20 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74   that is (a) not
13570 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29   at EOF, and (b)
13580 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
13590 61 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 20  a key that is a 
135a0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
135b0 74 68 65 72 2c 20 68 69 67 68 65 72 20 70 72 69  ther, higher pri
135c0 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65  ority, .** segme
135d0 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74  nt-iterator in t
135e0 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20  he pSeg->aSeg[] 
135f0 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
13600 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
13610 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35  erDoCompare(Fts5
13620 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
13630 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69  , int iOut){.  i
13640 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20  nt i1;          
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13660 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d  * Index of left-
13670 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
13680 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20   */.  int i2;   
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
136b0 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73  f right-hand Fts
136c0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
136d0 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65  t iRes;.  Fts5Se
136e0 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20  gIter *p1;      
136f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
13700 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
13710 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  er */.  Fts5SegI
13720 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20  ter *p2;        
13730 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
13740 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
13750 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75  r */.  Fts5CResu
13760 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
13770 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b  r->aFirst[iOut];
13780 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75 74  ..  assert( iOut
13790 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20  <pIter->nSeg && 
137a0 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  iOut>0 );.  asse
137b0 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d  rt( pIter->bRev=
137c0 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65  =0 || pIter->bRe
137d0 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69  v==1 );..  if( i
137e0 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65  Out>=(pIter->nSe
137f0 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d  g/2) ){.    i1 =
13800 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e   (iOut - pIter->
13810 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20  nSeg/2) * 2;.   
13820 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20   i2 = i1 + 1;.  
13830 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20  }else{.    i1 = 
13840 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
13850 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20  ut*2].iFirst;.  
13860 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46    i2 = pIter->aF
13870 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69  irst[iOut*2+1].i
13880 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20  First;.  }.  p1 
13890 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
138a0 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65  1];.  p2 = &pIte
138b0 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20  r->aSeg[i2];..  
138c0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20  pRes->bTermEq = 
138d0 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  0;.  if( p1->pLe
138e0 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  af==0 ){        
138f0 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61     /* If p1 is a
13900 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
13910 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20  s = i2;.  }else 
13920 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30  if( p2->pLeaf==0
13930 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32   ){     /* If p2
13940 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20   is at EOF */.  
13950 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d    iRes = i1;.  }
13960 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65  else{.    int re
13970 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
13980 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c  mpare(&p1->term,
13990 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20   &p2->term);.   
139a0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
139b0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e       assert( i2>
139c0 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  i1 );.      asse
139d0 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20  rt( i2!=0 );.   
139e0 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71     pRes->bTermEq
139f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
13a00 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e  p1->iRowid==p2->
13a10 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
13a20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d    p1->bDel = p2-
13a30 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72  >bDel;.        r
13a40 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20  eturn i2;.      
13a50 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28 28  }.      res = ((
13a60 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
13a70 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
13a80 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31  >bRev) ? -1 : +1
13a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13aa0 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20  rt( res!=0 );.  
13ab0 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
13ac0 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a       iRes = i1;.
13ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ae0 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20   iRes = i2;.    
13af0 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69  }.  }..  pRes->i
13b00 46 69 72 73 74 20 3d 20 28 75 31 36 29 69 52 65  First = (u16)iRe
13b10 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  s;.  return 0;.}
13b20 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
13b30 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61   seg-iter so tha
13b40 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
13b50 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
13b60 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f  n page iLeafPgno
13b70 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72  ..** It is an er
13b80 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61  ror if leaf iLea
13b90 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65  fPgno does not e
13ba0 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73  xist or contains
13bb0 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73   no rowids..*/.s
13bc0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
13bd0 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a  egIterGotoPage(.
13be0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
13c10 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
13c20 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
13c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13c40 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
13c50 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ance */.  int iL
13c60 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73  eafPgno.){.  ass
13c70 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70  ert( iLeafPgno>p
13c80 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
13c90 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66 50  );..  if( iLeafP
13ca0 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d  gno>pIter->pSeg-
13cb0 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
13cc0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
13cd0 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  RRUPT;.  }else{.
13ce0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
13cf0 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74  ase(pIter->pNext
13d00 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
13d10 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b  ->pNextLeaf = 0;
13d20 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
13d30 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
13d40 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  o-1;.    fts5Seg
13d50 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
13d60 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  pIter);.    asse
13d70 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
13d80 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69  E_OK || pIter->i
13d90 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50  LeafPgno==iLeafP
13da0 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
13db0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13dc0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f   ){.      int iO
13dd0 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20  ff;.      u8 *a 
13de0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
13df0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
13e00 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
13e10 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f  zLeaf;..      iO
13e20 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
13e30 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65 72  stRowidOff(pIter
13e40 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
13e50 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f  if( iOff<4 || iO
13e60 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  ff>=n ){.       
13e70 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
13e80 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
13e90 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
13ea0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
13eb0 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
13ec0 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
13ed0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
13ee0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
13ef0 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74  iOff;.        ft
13f00 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
13f10 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
13f20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
13f30 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
13f40 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
13f50 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
13f60 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c  d argument until
13f70 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a   it is at or .**
13f80 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f   past rowid iFro
13f90 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  m. Regardless of
13fa0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46   the value of iF
13fb0 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f  rom, the iterato
13fc0 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61  r is.** always a
13fd0 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74  dvanced at least
13fe0 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   once..*/.static
13ff0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
14000 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
14010 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14030 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
14040 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
14050 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
14060 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14070 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
14080 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20  */.  i64 iMatch 
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
140b0 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73  iterator at leas
140c0 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b  t this far */.){
140d0 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70  .  int bRev = (p
140e0 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
140f0 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
14100 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78  SE);.  Fts5Dlidx
14110 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
14120 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
14130 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20  int iLeafPgno = 
14140 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14150 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20  ;.  int bMove = 
14160 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  1;..  assert( pI
14170 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
14180 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
14190 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
141a0 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a  Iter->pDlidx );.
141b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
141c0 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28  >pLeaf );..  if(
141d0 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20   bRev==0 ){.    
141e0 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64  while( !fts5Dlid
141f0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
14200 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74  dx) && iMatch>ft
14210 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
14220 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20  (pDlidx) ){.    
14230 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74    iLeafPgno = ft
14240 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
14250 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
14260 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
14270 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
14280 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63   }.    assert_nc
14290 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74  ( iLeafPgno>=pIt
142a0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c  er->iLeafPgno ||
142b0 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66   p->rc );.    if
142c0 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
142d0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
142e0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
142f0 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74  rGotoPage(p, pIt
14300 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  er, iLeafPgno);.
14310 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
14320 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
14330 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
14340 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
14350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
14360 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f  Match<pIter->iRo
14370 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  wid );.    while
14380 28 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72  ( !fts5DlidxIter
14390 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26  Eof(p, pDlidx) &
143a0 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69  & iMatch<fts5Dli
143b0 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
143c0 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  dx) ){.      fts
143d0 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
143e0 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d  , pDlidx);.    }
143f0 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d  .    iLeafPgno =
14400 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
14410 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20  no(pDlidx);..   
14420 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
14430 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
14440 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e  idx) || iLeafPgn
14450 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o<=pIter->iLeafP
14460 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
14470 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d  iLeafPgno<pIter-
14480 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
14490 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
144a0 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
144b0 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +1;.      fts5Se
144c0 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50  gIterReverseNewP
144d0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
144e0 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
144f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
14500 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 26  .    if( bMove &
14510 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
14520 4f 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e 65 78  OK ) pIter->xNex
14530 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  t(p, pIter, 0);.
14540 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
14550 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
14560 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
14570 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69   && pIter->iRowi
14580 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
14590 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21  k;.    if( bRev!
145a0 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
145b0 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
145c0 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d  eak;.    bMove =
145d0 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d   1;.  }while( p-
145e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
145f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  ;.}.../*.** Free
14600 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
14610 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
14620 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14630 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
14640 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
14650 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Free(Fts5Index *
14660 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  p, Fts5IndexIter
14670 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
14680 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
14690 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
146a0 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
146b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
146c0 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
146d0 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
146e0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
146f0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 49  uctureRelease(pI
14700 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20  ter->pStruct);. 
14710 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
14720 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  e(&pIter->poslis
14730 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
14740 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
14750 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
14760 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
14770 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64  anced(.  Fts5Ind
14780 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
14790 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
147a0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
147b0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
147c0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
147d0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
147e0 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
147f0 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
14800 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
14810 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20  t iChanged,     
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14830 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
14840 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
14850 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  nced */.  int iM
14860 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20  inset           
14870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
14880 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46  imum entry in aF
14890 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f  irst[] to set */
148a0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
148b0 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
148c0 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69  g+iChanged)/2; i
148d0 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e  >=iMinset && p->
148e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
148f0 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69  =i/2){.    int i
14900 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71  Eq;.    if( (iEq
14910 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
14920 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c  DoCompare(pIter,
14930 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 46 74   i)) ){.      Ft
14940 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
14950 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
14960 45 71 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq];.      asser
14970 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
14980 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65  _OK );.      pSe
14990 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67  g->xNext(p, pSeg
149a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  , 0);.      i = 
149b0 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45  pIter->nSeg + iE
149c0 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  q;.    }.  }.}..
149d0 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72 61 74  /*.** Sub-iterat
149e0 6f 72 20 69 43 68 61 6e 67 65 64 20 6f 66 20 69  or iChanged of i
149f0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 68 61  terator pIter ha
14a00 73 20 6a 75 73 74 20 62 65 65 6e 20 61 64 76 61  s just been adva
14a10 6e 63 65 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a  nced. It still.*
14a20 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
14a30 73 61 6d 65 20 74 65 72 6d 20 74 68 6f 75 67 68  same term though
14a40 20 2d 20 6a 75 73 74 20 61 20 64 69 66 66 65 72   - just a differ
14a50 65 6e 74 20 72 6f 77 69 64 2e 20 54 68 69 73 20  ent rowid. This 
14a60 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65  function.** atte
14a70 6d 70 74 73 20 74 6f 20 75 70 64 61 74 65 20 74  mpts to update t
14a80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
14a90 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  he pIter->aFirst
14aa0 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  [] accordingly..
14ab0 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 73 6f  ** If it does so
14ac0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 30   successfully, 0
14ad0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
14ae0 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a  herwise 1..**.**
14af0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
14b00 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
14b10 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c  ller should call
14b20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
14b30 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74  vanced().** on t
14b40 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 73 74  he iterator inst
14b50 65 61 64 2e 20 54 68 61 74 20 66 75 6e 63 74 69  ead. That functi
14b60 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  on does the same
14b70 20 61 73 20 74 68 69 73 20 6f 6e 65 2c 20 65 78   as this one, ex
14b80 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
14b90 64 65 61 6c 73 20 77 69 74 68 20 6d 6f 72 65 20  deals with more 
14ba0 63 6f 6d 70 6c 69 63 61 74 65 64 20 63 61 73 65  complicated case
14bb0 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73  s as well..*/ .s
14bc0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
14bd0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
14be0 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
14bf0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14c00 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
14c10 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
14c20 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
14c30 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
14c40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
14c50 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
14c60 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
14c70 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
14c80 69 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20  iChanged        
14c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14ca0 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
14cb0 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
14cc0 65 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  ed */.){.  Fts5S
14cd0 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26  egIter *pNew = &
14ce0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61  pIter->aSeg[iCha
14cf0 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e  nged];..  if( pN
14d00 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  ew->iRowid==pIte
14d10 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
14d20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f     || (pNew->iRo
14d30 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74  wid<pIter->iSwit
14d40 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
14d50 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20 20 69  >bRev.  ){.    i
14d60 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35 53 65  nt i;.    Fts5Se
14d70 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20  gIter *pOther = 
14d80 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68  &pIter->aSeg[iCh
14d90 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b  anged ^ 0x0001];
14da0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69  .    pIter->iSwi
14db0 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74 65 72  tchRowid = pIter
14dc0 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53  ->bRev ? SMALLES
14dd0 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47 45 53  T_INT64 : LARGES
14de0 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72  T_INT64;.    for
14df0 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b  (i=(pIter->nSeg+
14e00 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20  iChanged)/2; 1; 
14e10 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20 46 74  i=i/2){.      Ft
14e20 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
14e30 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
14e40 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  [i];..      asse
14e50 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20  rt( pNew->pLeaf 
14e60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14e70 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d   pRes->bTermEq==
14e80 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65  0 || pOther->pLe
14e90 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  af );..      if(
14ea0 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29   pRes->bTermEq )
14eb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  {.        if( pN
14ec0 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68  ew->iRowid==pOth
14ed0 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  er->iRowid ){.  
14ee0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
14ef0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
14f00 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f  if( (pOther->iRo
14f10 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64  wid>pNew->iRowid
14f20 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
14f30 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
14f40 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
14f50 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
14f60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
14f70 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20 20 20   = pOther;.     
14f80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
14f90 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74  ther->iRowid>pIt
14fa0 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
14fb0 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
14fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
14fd0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
14fe0 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
14ff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15000 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73 2d 3e    }.      pRes->
15010 69 46 69 72 73 74 20 3d 20 28 75 31 36 29 28 70  iFirst = (u16)(p
15020 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65  New - pIter->aSe
15030 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  g);.      if( i=
15040 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =1 ) break;..   
15050 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74     pOther = &pIt
15060 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
15070 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30  >aFirst[i ^ 0x00
15080 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  01].iFirst ];.  
15090 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
150a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
150b0 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f  t the pIter->bEo
150c0 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64  f variable based
150d0 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66   on the state of
150e0 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f   the sub-iterato
150f0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
15100 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15110 53 65 74 45 6f 66 28 46 74 73 35 49 6e 64 65 78  SetEof(Fts5Index
15120 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15130 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15140 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
15150 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15160 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70  1].iFirst ];.  p
15170 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65  Iter->bEof = pSe
15180 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70  g->pLeaf==0;.  p
15190 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
151a0 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
151b0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
151c0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
151d0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
151e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
151f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
15200 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
15210 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
15220 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
15230 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
15240 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
15250 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
15260 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
15270 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
15280 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
15290 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
152a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
152b0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
152c0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
152d0 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65   .  Fts5IndexIte
152e0 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
152f0 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
15300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15310 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
15320 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
15330 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
15360 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
15370 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
15380 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15390 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
153a0 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
153b0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
153c0 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
153d0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
153e0 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
153f0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
15400 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15410 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
15420 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
15430 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
15440 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
15450 20 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72        if( bUseFr
15460 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
15470 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
15480 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
15490 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
154a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
154b0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e          pSeg->xN
154c0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e  ext(p, pSeg, &bN
154d0 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d  ewTerm);.      }
154e0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  ..      if( pSeg
154f0 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e  ->pLeaf==0 || bN
15500 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c  ewTerm .       |
15510 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  | fts5MultiIterA
15520 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20 70  dvanceRowid(p, p
15530 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20 20  Iter, iFirst).  
15540 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66      ){.        f
15550 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15560 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69  nced(p, pIter, i
15570 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  First, 1);.     
15580 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
15590 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20  SetEof(pIter);. 
155a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
155b0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
155c0 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b  Setup(p, pIter);
155d0 0a 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d  ..      bUseFrom
155e0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
155f0 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
15600 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
15610 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
15620 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Iter) );.  }.}..
15630 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15640 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 0a  MultiIterNext2(.
15650 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
15660 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
15670 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a   *pIter,.  int *
15680 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
15690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
156a0 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69 67 68  T: True if *migh
156b0 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d 20 2a  t* be new term *
156c0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
156d0 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
156e0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   );.  if( p->rc=
156f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15700 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
15710 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
15720 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15730 74 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  t;.      Fts5Seg
15740 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
15750 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74  ter->aSeg[iFirst
15760 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  ];.      int bNe
15770 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20  wTerm = 0;..    
15780 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
15790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
157a0 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
157b0 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65  p, pSeg, &bNewTe
157c0 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rm);.      if( p
157d0 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
157e0 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
157f0 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
15800 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
15810 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29  , pIter, iFirst)
15820 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
15830 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
15840 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
15850 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
15860 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
15870 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29  terSetEof(pIter)
15880 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77  ;.        *pbNew
15890 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
158a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
158b0 70 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20  pbNewTerm = 0;. 
158c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
158d0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
158e0 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b  Setup(p, pIter);
158f0 0a 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74  ..    }while( ft
15900 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
15910 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a  ty(p, pIter) );.
15920 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 46    }.}...static F
15930 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 66 74  ts5IndexIter *ft
15940 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
15950 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15970 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15980 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
15990 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ithin */.  int n
159a0 53 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64  Seg.){.  Fts5Ind
159b0 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20  exIter *pNew;.  
159c0 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20  /* Power of two 
159f0 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f  >= nSeg */..  fo
15a00 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74  r(nSlot=2; nSlot
15a10 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c  <nSeg; nSlot=nSl
15a20 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ot*2);.  pNew = 
15a30 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
15a40 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46   .      sizeof(F
15a50 74 73 35 49 6e 64 65 78 49 74 65 72 29 20 2b 20  ts5IndexIter) + 
15a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
15a70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  New */.      siz
15a80 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
15a90 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20   * (nSlot-1) +  
15aa0 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d   /* pNew->aSeg[]
15ab0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
15ac0 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20  (Fts5CResult) * 
15ad0 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a  nSlot         /*
15ae0 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20   pNew->aFirst[] 
15af0 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  */.  );.  if( pN
15b00 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
15b10 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20  nSeg = nSlot;.  
15b20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d    pNew->aFirst =
15b30 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26   (Fts5CResult*)&
15b40 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74  pNew->aSeg[nSlot
15b50 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  ];.    pNew->pIn
15b60 64 65 78 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  dex = p;.  }.  r
15b70 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
15b80 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
15b90 6e 65 77 20 46 74 73 35 49 6e 64 65 78 49 74 65  new Fts5IndexIte
15ba0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
15bb0 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
15bc0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
15bd0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
15be0 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65  ata in structure
15bf0 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20   pStruct..** If 
15c00 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74  iLevel is -ve, t
15c10 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20  hen all data in 
15c20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20  all segments is 
15c30 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69  merged. Or, if i
15c40 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f  Level.** is zero
15c50 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74   or greater, dat
15c60 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  a from the first
15c70 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e   nSegment segmen
15c80 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts on level iLev
15c90 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e  el.** is merged.
15ca0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
15cb0 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f  tor initially po
15cc0 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
15cd0 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74  t term/rowid ent
15ce0 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74  ry in the .** it
15cf0 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  erated data..*/.
15d00 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15d10 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
15d20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
15d50 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
15d60 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
15d70 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20  ture *pStruct,  
15d80 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
15d90 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ure of specific 
15da0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62  index */.  int b
15db0 53 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20  SkipEmpty,      
15dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15dd0 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c  ue to ignore del
15de0 65 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e  ete-keys */.  in
15df0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e10 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
15e20 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
15e30 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
15e40 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
15e50 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
15e60 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a  to (or NULL/0) *
15e70 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
15ea0 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20  iterate (-1 for 
15eb0 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  all) */.  int nS
15ec0 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20  egment,         
15ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15ee0 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
15ef0 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c  to merge (iLevel
15f00 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 6e  >=0) */.  Fts5In
15f10 64 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  dexIter **ppOut 
15f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
15f30 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
15f40 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
15f70 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73  ment-iters in us
15f80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72  e */.  int iIter
15f90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15fa0 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69         /* */.  i
15fb0 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  nt iSeg;        
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fd0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
15fe0 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
15ff0 74 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ts */.  Fts5Buff
16000 65 72 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d  er buf = {0,0,0}
16010 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65  ;       /* Buffe
16020 72 20 75 73 65 64 20 62 79 20 66 74 73 35 53 65  r used by fts5Se
16030 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 29 20  gIterSeekInit() 
16040 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
16050 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
16060 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
16070 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28  pNew;..  assert(
16080 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54   (pTerm==0 && nT
16090 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65  erm==0) || iLeve
160a0 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  l<0 );..  /* All
160b0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
160c0 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65  the new multi-se
160d0 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20  g-iterator. */. 
160e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
160f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
16100 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
16110 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
16120 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74  ct->nSegment==ft
16130 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
16140 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
16150 29 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20  ) );.      nSeg 
16160 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  = pStruct->nSegm
16170 65 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20  ent;.      nSeg 
16180 2b 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31  += (p->pHash ? 1
16190 20 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65   : 0);.    }else
161a0 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d  {.      nSeg = M
161b0 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  IN(pStruct->aLev
161c0 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c  el[iLevel].nSeg,
161d0 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20   nSegment);.    
161e0 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d  }.  }.  *ppOut =
161f0 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74   pNew = fts5Mult
16200 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53  iIterAlloc(p, nS
16210 65 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  eg);.  if( pNew=
16220 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
16230 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d  New->bRev = (0!=
16240 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
16250 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b  EX_QUERY_DESC));
16260 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  .  pNew->bSkipEm
16270 70 74 79 20 3d 20 28 75 38 29 62 53 6b 69 70 45  pty = (u8)bSkipE
16280 6d 70 74 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  mpty;.  pNew->pS
16290 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
162a0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
162b0 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a 0a 20  Ref(pStruct);.. 
162c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
162d0 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
162e0 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
162f0 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
16300 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
16310 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
16320 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
16330 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
16340 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
16350 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20     if( p->pHash 
16360 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  ){.      /* Add 
16370 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  a segment iterat
16380 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  or for the curre
16390 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
163a0 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
163b0 2f 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  /.      Fts5SegI
163c0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
163d0 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
163e0 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ];.      fts5Seg
163f0 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20  IterHashInit(p, 
16400 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  pTerm, nTerm, fl
16410 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  ags, pIter);.   
16420 20 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d   }.    for(pLvl=
16430 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
16440 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
16450 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66  pLvl++){.      f
16460 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
16470 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
16480 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
16490 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
164a0 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
164b0 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
164c0 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
164d0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
164e0 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
164f0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
16500 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
16510 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
16520 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49  Init(p, pSeg, pI
16530 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ter);.        }e
16540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
16550 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
16560 69 74 28 70 2c 20 26 62 75 66 2c 20 70 54 65 72  it(p, &buf, pTer
16570 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
16580 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20   pSeg, pIter);. 
16590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
165a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
165b0 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
165c0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
165d0 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53 65  el];.    for(iSe
165e0 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  g=nSeg-1; iSeg>=
165f0 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
16600 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69    fts5SegIterIni
16610 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  t(p, &pLvl->aSeg
16620 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61  [iSeg], &pNew->a
16630 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20  Seg[iIter++]);. 
16640 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
16650 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29  t( iIter==nSeg )
16660 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  ;..  /* If the a
16670 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73  bove was success
16680 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  ful, each compon
16690 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f  ent iterators no
166a0 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74  w points .  ** t
166b0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
166c0 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74  y in its segment
166d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
166e0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20  nitialize the . 
166f0 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72   ** aFirst[] arr
16700 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ay. Or, if an er
16710 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
16720 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61  , free the itera
16730 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  tor.  ** object 
16740 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70  and set the outp
16750 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
16760 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
16770 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16780 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72  ){.    for(iIter
16790 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pNew->nSeg-1; i
167a0 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29  Iter>0; iIter--)
167b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b  {.      int iEq;
167c0 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20  .      if( (iEq 
167d0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
167e0 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69  oCompare(pNew, i
167f0 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20  Iter)) ){.      
16800 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
16810 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  Seg = &pNew->aSe
16820 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20  g[iEq];.        
16830 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
16840 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65  E_OK ) pSeg->xNe
16850 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
16860 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
16870 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
16880 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65   pNew, iEq, iIte
16890 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
168a0 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
168b0 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b  terSetEof(pNew);
168c0 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
168d0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
168e0 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
168f0 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
16900 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74  y && fts5MultiIt
16910 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65  erIsEmpty(p, pNe
16920 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  w) ){.      fts5
16930 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
16940 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20   pNew, 0, 0);.  
16950 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
16960 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
16970 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ee(p, pNew);.   
16980 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
16990 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
169a0 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(&buf);.}../*.*
169b0 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35  * Create an Fts5
169c0 49 6e 64 65 78 49 74 65 72 20 74 68 61 74 20 69  IndexIter that i
169d0 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
169e0 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76  the doclist prov
169f0 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ided.** as the s
16a00 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
16a10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16a20 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
16a30 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16a50 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
16a60 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
16a70 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44  ithin */.  Fts5D
16a80 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20  ata *pData,     
16a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
16aa0 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74 65  clist to iterate
16ab0 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e   through */.  in
16ac0 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ae0 20 54 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e   True for descen
16af0 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
16b00 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
16b10 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
16b20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
16b30 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
16b40 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b  IndexIter *pNew;
16b50 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75  .  pNew = fts5Mu
16b60 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20  ltiIterAlloc(p, 
16b70 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  2);.  if( pNew )
16b80 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
16b90 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
16ba0 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20  ->aSeg[1];..    
16bb0 70 4e 65 77 2d 3e 62 46 69 6c 74 65 72 65 64 20  pNew->bFiltered 
16bc0 3d 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  = 1;.    pIter->
16bd0 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45 47  flags = FTS5_SEG
16be0 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
16bf0 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c    if( pData->szL
16c00 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  eaf>0 ){.      p
16c10 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44  Iter->pLeaf = pD
16c20 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ata;.      pIter
16c30 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
16c40 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44  fts5GetVarint(pD
16c50 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  ata->p, (u64*)&p
16c60 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
16c70 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
16c80 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61 74  ofDoclist = pDat
16c90 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65  a->nn;.      pNe
16ca0 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
16cb0 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  rst = 1;.      i
16cc0 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
16cd0 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d      pNew->bRev =
16ce0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   1;.        pIte
16cf0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
16d00 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
16d10 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
16d20 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
16d30 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
16d40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16d50 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
16d60 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
16d70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
16d80 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
16d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
16da0 65 77 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  ew->bEof = 1;.  
16db0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49    }.    fts5SegI
16dc0 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49  terSetNext(p, pI
16dd0 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75  ter);..    *ppOu
16de0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
16df0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
16e00 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pData);.}../*.*
16e10 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
16e20 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
16e30 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e   at EOF or if an
16e40 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
16e50 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f  red. .** False o
16e60 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
16e70 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
16e80 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  iIterEof(Fts5Ind
16e90 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78  ex *p, Fts5Index
16ea0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
16eb0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20  assert( p->rc . 
16ec0 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
16ed0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
16ee0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
16ef0 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
16f00 2d 3e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72  ->bEof .  );.  r
16f10 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
16f20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d 0a  pIter->bEof);.}.
16f30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16f40 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65  e rowid of the e
16f50 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
16f60 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
16f70 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49   points.** to. I
16f80 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
16f90 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65  oints to EOF whe
16fa0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16fb0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a  is called the.**
16fc0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64   results are und
16fd0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
16fe0 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49  c i64 fts5MultiI
16ff0 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64  terRowid(Fts5Ind
17000 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
17010 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
17020 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
17030 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
17040 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75  .pLeaf );.  retu
17050 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  rn pIter->aSeg[ 
17060 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
17070 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64  .iFirst ].iRowid
17080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
17090 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
170a0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61  the next entry a
170b0 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  t or following i
170c0 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Match..*/.static
170d0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
170e0 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
170f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
17100 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
17110 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61  Iter, .  i64 iMa
17120 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20  tch.){.  while( 
17130 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  1 ){.    i64 iRo
17140 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  wid;.    fts5Mul
17150 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
17160 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b  ter, 1, iMatch);
17170 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c  .    if( fts5Mul
17180 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
17190 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  er) ) break;.   
171a0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
171b0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
171c0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
171d0 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69  er->bRev==0 && i
171e0 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
171f0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
17200 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26  Iter->bRev!=0 &&
17210 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
17220 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
17230 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
17240 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
17250 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
17260 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65  e term associate
17270 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65  d with the .** e
17280 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
17290 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
172a0 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
172b0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a  tatic const u8 *
172c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
172d0 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  m(Fts5IndexIter 
172e0 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
172f0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
17300 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
17310 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
17320 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
17330 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
17340 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
17350 6d 2e 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  m.p;.}..static v
17360 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
17370 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rate(.  Fts5Inde
17380 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17390 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
173a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
173b0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173d0 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20  Poslist of this 
173e0 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f  iterator */.  vo
173f0 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17410 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   Context pointer
17420 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c   for xChunk call
17430 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
17440 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64  *xChunk)(Fts5Ind
17450 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73  ex*, void*, cons
17460 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20  t u8*, int).){. 
17470 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67   int nRem = pSeg
17480 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  ->nPos;         
17490 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
174a0 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d  tes still to com
174b0 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
174c0 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38  *pData = 0;.  u8
174d0 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67   *pChunk = &pSeg
174e0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
174f0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
17500 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49   int nChunk = MI
17510 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c  N(nRem, pSeg->pL
17520 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  eaf->szLeaf - pS
17530 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29  eg->iLeafOffset)
17540 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70  ;.  int pgno = p
17550 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  Seg->iLeafPgno;.
17560 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d    int pgnoSave =
17570 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
17580 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
17590 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74 61 69  mwork with detai
175a0 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73 65 73  l=none databases
175b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
175c0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
175d0 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
175e0 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 28  NONE );..  if( (
175f0 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46 54  pSeg->flags & FT
17600 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
17610 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67  SE)==0 ){.    pg
17620 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b  noSave = pgno+1;
17630 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
17640 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28 70   ){.    xChunk(p
17650 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20  , pCtx, pChunk, 
17660 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65  nChunk);.    nRe
17670 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20  m -= nChunk;.   
17680 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
17690 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  (pData);.    if(
176a0 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20   nRem<=0 ){.    
176b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
176c0 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b  se{.      pgno++
176d0 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
176e0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
176f0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
17700 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69  ID(pSeg->pSeg->i
17710 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20  Segid, pgno));. 
17720 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d       if( pData==
17730 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
17740 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61   pChunk = &pData
17750 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43  ->p[4];.      nC
17760 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
17770 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
17780 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   4);.      if( p
17790 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b  gno==pgnoSave ){
177a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
177b0 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
177c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
177d0 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  Seg->pNextLeaf =
177e0 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   pData;.        
177f0 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  pData = 0;.     
17800 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
17810 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
17820 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69   a new segment-i
17830 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
17840 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 65  ure pStruct. The
17850 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20   new segment.** 
17860 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  id must be betwe
17870 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20 69  en 1 and 65335 i
17880 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75  nclusive, and mu
17890 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62  st not be used b
178a0 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e  y .** any curren
178b0 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65 67  tly existing seg
178c0 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20  ment. If a free 
178d0 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f  segment id canno
178e0 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53  t be found,.** S
178f0 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65  QLITE_FULL is re
17900 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
17910 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
17920 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
17930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17940 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a   a no-op. 0 is .
17950 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74  ** returned in t
17960 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
17970 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f  tic int fts5Allo
17980 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e  cateSegid(Fts5In
17990 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75  dex *p, Fts5Stru
179a0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
179b0 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20  .  int iSegid = 
179c0 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
179d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
179e0 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
179f0 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41  Segment>=FTS5_MA
17a00 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20  X_SEGMENT ){.   
17a10 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
17a20 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  E_FULL;.    }els
17a30 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e{.      while( 
17a40 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
17a50 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
17a60 53 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Seg;.        sql
17a70 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
17a80 73 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76 6f  sizeof(u32), (vo
17a90 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20 20  id*)&iSegid);.  
17aa0 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 69        iSegid = i
17ab0 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46  Segid & ((1 << F
17ac0 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31  TS5_DATA_ID_B)-1
17ad0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
17ae0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
17af0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
17b00 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
17b10 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
17b20 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
17b30 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
17b40 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
17b50 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53    if( iSegid==pS
17b60 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
17b70 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl].aSeg[iSeg].i
17b80 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Segid ){.       
17b90 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20         iSegid = 
17ba0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
17bb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17bd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
17be0 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a  rn iSegid;.}../*
17bf0 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20  .** Discard all 
17c00 64 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63  data currently c
17c10 61 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73  ached in the has
17c20 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  h-tables..*/.sta
17c30 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
17c40 65 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74  exDiscardData(Ft
17c50 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61  s5Index *p){.  a
17c60 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
17c70 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  || p->nPendingDa
17c80 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ta==0 );.  if( p
17c90 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73  ->pHash ){.    s
17ca0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c  qlite3Fts5HashCl
17cb0 65 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20  ear(p->pHash);. 
17cc0 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
17cd0 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ta = 0;.  }.}../
17ce0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17cf0 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66  size of the pref
17d00 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68  ix, in bytes, th
17d10 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f  at buffer (nNew/
17d20 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20  pNew) shares.** 
17d30 77 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c  with buffer (nOl
17d40 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74  d/pOld)..*/.stat
17d50 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69  ic int fts5Prefi
17d60 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74  xCompress(.  int
17d70 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20   nOld, const u8 
17d80 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65  *pOld,.  int nNe
17d90 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65  w, const u8 *pNe
17da0 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  w.){.  int i;.  
17db0 61 73 73 65 72 74 28 20 66 74 73 35 42 6c 6f 62  assert( fts5Blob
17dc0 43 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20 6e 4f  Compare(pOld, nO
17dd0 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 29 3c  ld, pNew, nNew)<
17de0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
17df0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
17e00 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70    if( pOld[i]!=p
17e10 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  New[i] ) break;.
17e20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
17e30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
17e40 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65  ts5WriteDlidxCle
17e50 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ar(.  Fts5Index 
17e60 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
17e70 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
17e80 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20   int bFlush     
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ea0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69   /* If true, wri
17eb0 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b  te dlidx to disk
17ec0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
17ed0 20 20 61 73 73 65 72 74 28 20 62 46 6c 75 73 68    assert( bFlush
17ee0 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  ==0 || (pWriter-
17ef0 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
17f00 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
17f10 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f  buf.n>0) );.  fo
17f20 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72  r(i=0; i<pWriter
17f30 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a  ->nDlidx; i++){.
17f40 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
17f50 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
17f60 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
17f70 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  ];.    if( pDlid
17f80 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72  x->buf.n==0 ) br
17f90 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c  eak;.    if( bFl
17fa0 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ush ){.      ass
17fb0 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e  ert( pDlidx->pgn
17fc0 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74  o!=0 );.      ft
17fd0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
17fe0 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
17ff0 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
18000 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
18010 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
18020 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
18030 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
18040 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
18050 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
18060 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
18070 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20  Dlidx->buf);.   
18080 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
18090 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  lid = 0;.  }.}..
180a0 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70  /*.** Grow the p
180b0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d  Writer->aDlidx[]
180c0 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61   array to at lea
180d0 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73  st nLvl elements
180e0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79   in size..** Any
180f0 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65   new array eleme
18100 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62  nts are zeroed b
18110 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
18130 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
18140 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  w(.  Fts5Index *
18150 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  p,.  Fts5SegWrit
18160 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
18170 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28  nt nLvl.){.  if(
18180 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18190 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74  K && nLvl>=pWrit
181a0 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20  er->nDlidx ){.  
181b0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
181c0 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73  r *aDlidx = (Fts
181d0 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71  5DlidxWriter*)sq
181e0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
181f0 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
18200 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46  aDlidx, sizeof(F
18210 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20  ts5DlidxWriter) 
18220 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20  * nLvl.    );.  
18230 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20    if( aDlidx==0 
18240 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
18250 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18270 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
18280 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  of(Fts5DlidxWrit
18290 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57  er) * (nLvl - pW
182a0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a  riter->nDlidx);.
182b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44        memset(&aD
182c0 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44  lidx[pWriter->nD
182d0 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29  lidx], 0, nByte)
182e0 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
182f0 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78  >aDlidx = aDlidx
18300 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
18310 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a  >nDlidx = nLvl;.
18320 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18330 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
18340 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
18350 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  t doclist-index 
18360 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20  accumulating in 
18370 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
18380 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  ] is large.** en
18390 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74  ough, flush it t
183a0 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72  o disk and retur
183b0 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64  n 1. Otherwise d
183c0 69 73 63 61 72 64 20 69 74 20 61 6e 64 20 72 65  iscard it and re
183d0 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f  turn.** zero..*/
183e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
183f0 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28  WriteFlushDlidx(
18400 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
18410 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
18420 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c  iter){.  int bFl
18430 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ag = 0;..  /* If
18440 20 74 68 65 72 65 20 77 65 72 65 20 46 54 53 35   there were FTS5
18450 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
18460 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65  or more empty le
18470 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
18480 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  .  ** to the dat
18490 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74  abase, also writ
184a0 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  e the doclist-in
184b0 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f  dex to disk.  */
184c0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
184d0 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
184e0 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45  0 && pWriter->nE
184f0 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44  mpty>=FTS5_MIN_D
18500 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20  LIDX_SIZE ){.   
18510 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a   bFlag = 1;.  }.
18520 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
18530 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72  Clear(p, pWriter
18540 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69  , bFlag);.  pWri
18550 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b  ter->nEmpty = 0;
18560 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b  .  return bFlag;
18570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18580 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
18590 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65  d whenever proce
185a0 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63  ssing of the doc
185b0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a  list for the .**
185c0 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65   last term on le
185d0 61 66 20 70 61 67 65 20 28 70 57 72 69 74 65 72  af page (pWriter
185e0 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20 63 6f  ->iBtPage) is co
185f0 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  mpleted. .**.** 
18600 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  The doclist-inde
18610 78 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20  x for that term 
18620 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
18630 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69  red in-memory wi
18640 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35  thin the.** Fts5
18650 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78  SegWriter.aDlidx
18660 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74 20  [] array. If it 
18670 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c  is large enough,
18680 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
18690 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75 74 20  * writes it out 
186a0 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20  to disk. Or, if 
186b0 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  it is too small 
186c0 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20  to bother with, 
186d0 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a  discards.** it..
186e0 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69  **.** Fts5SegWri
186f0 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65  ter.btterm curre
18700 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntly contains th
18710 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
18720 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f  page iBtPage..*/
18730 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18740 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65  5WriteFlushBtree
18750 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
18760 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
18770 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46  riter){.  int bF
18780 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  lag;..  assert( 
18790 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
187a0 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   || pWriter->nEm
187b0 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pty==0 );.  if( 
187c0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
187d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
187e0 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74  bFlag = fts5Writ
187f0 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70  eFlushDlidx(p, p
18800 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20  Writer);..  if( 
18810 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18820 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
18830 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72  ar *z = (pWriter
18840 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f  ->btterm.n>0?(co
18850 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69 74 65  nst char*)pWrite
18860 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b  r->btterm.p:"");
18870 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
18880 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64  owing was alread
18890 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72  y done in fts5Wr
188a0 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20  iteInit(): */.  
188b0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e    /* sqlite3_bin
188c0 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69  d_int(p->pIdxWri
188d0 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d  ter, 1, pWriter-
188e0 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20  >iSegid); */.   
188f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
18900 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ob(p->pIdxWriter
18910 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d  , 2, z, pWriter-
18920 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54  >btterm.n, SQLIT
18930 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
18940 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
18950 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  4(p->pIdxWriter,
18960 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36   3, bFlag + ((i6
18970 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  4)pWriter->iBtPa
18980 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c  ge<<1));.    sql
18990 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
189a0 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d  xWriter);.    p-
189b0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
189c0 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65  set(p->pIdxWrite
189d0 72 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65  r);.  }.  pWrite
189e0 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a  r->iBtPage = 0;.
189f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
18a00 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
18a10 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   each leaf page 
18a20 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74  except the first
18a30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
18a40 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  * at least one t
18a50 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e  erm. Argument (n
18a60 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74  Term/pTerm) is t
18a70 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61  he split-key - a
18a80 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73   term that.** is
18a90 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
18aa0 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74   terms written t
18ab0 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73  o earlier leaves
18ac0 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f  , and equal to o
18ad0 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61  r.** smaller tha
18ae0 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  n the first term
18af0 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66   on the new leaf
18b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
18b10 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
18b20 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
18b30 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
18b40 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a  c. If an error.*
18b50 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  * has already oc
18b60 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
18b70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
18b80 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
18b90 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
18ba0 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
18bb0 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  eTerm(.  Fts5Ind
18bc0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
18bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
18be0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
18bf0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
18c00 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
18c10 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
18c20 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
18c30 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
18c40 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69  pTerm      /* Fi
18c50 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20  rst term on new 
18c60 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73  page */.){.  fts
18c70 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65  5WriteFlushBtree
18c80 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
18c90 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
18ca0 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
18cb0 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  btterm, nTerm, p
18cc0 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72  Term);.  pWriter
18cd0 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72 69  ->iBtPage = pWri
18ce0 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f  ter->writer.pgno
18cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18d00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18d10 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67  ed when flushing
18d20 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 68 61   a leaf page tha
18d30 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a  t contains no.**
18d40 20 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f   terms at all to
18d50 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
18d60 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
18d70 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74  treeNoTerm(.  Ft
18d80 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18da0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
18db0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
18dc0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
18dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
18de0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ter object */.){
18df0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
18e00 65 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e  ere no rowids on
18e10 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 65   the leaf page e
18e20 69 74 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f  ither and the do
18e30 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a  clist-index.  **
18e40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
18e50 6e 20 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e  n started, appen
18e60 64 20 61 6e 20 30 78 30 30 20 62 79 74 65 20 74  d an 0x00 byte t
18e70 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20  o it.  */.  if( 
18e80 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
18e90 6f 77 69 64 49 6e 50 61 67 65 20 26 26 20 70 57  owidInPage && pW
18ea0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
18eb0 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  .buf.n>0 ){.    
18ec0 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
18ed0 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74  *pDlidx = &pWrit
18ee0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20  er->aDlidx[0];. 
18ef0 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
18f00 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b  x->bPrevValid );
18f10 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
18f20 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
18f30 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
18f40 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d  dx->buf, 0);.  }
18f50 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
18f60 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20   the "number of 
18f70 73 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65  sequential leave
18f80 73 20 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d  s without a term
18f90 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20  " counter. */.  
18fa0 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b  pWriter->nEmpty+
18fb0 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34  +;.}..static i64
18fc0 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63   fts5DlidxExtrac
18fd0 74 46 69 72 73 74 52 6f 77 69 64 28 46 74 73 35  tFirstRowid(Fts5
18fe0 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20  Buffer *pBuf){. 
18ff0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69   i64 iRowid;.  i
19000 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66  nt iOff;..  iOff
19010 20 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56 61   = 1 + fts5GetVa
19020 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d  rint(&pBuf->p[1]
19030 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
19040 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e  ;.  fts5GetVarin
19050 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d  t(&pBuf->p[iOff]
19060 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
19070 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69  ;.  return iRowi
19080 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69  d;.}../*.** Rowi
19090 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73  d iRowid has jus
190a0 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20  t been appended 
190b0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  to the current l
190c0 65 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20  eaf page. It is 
190d0 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20  the.** first on 
190e0 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  the page. This f
190f0 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
19100 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
19110 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72  ntry to the curr
19120 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  ent.** doclist-i
19130 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
19140 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
19150 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73  idxAppend(.  Fts
19160 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
19170 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
19180 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f  iter, .  i64 iRo
19190 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  wid.){.  int i;.
191a0 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
191b0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
191c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
191d0 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
191e0 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
191f0 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
19200 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
19210 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
19220 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  ;..    if( pDlid
19230 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f  x->buf.n>=p->pCo
19240 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
19250 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
19260 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  nt doclist-index
19270 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57   page is full. W
19280 72 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20  rite it to disk 
19290 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a  and push.      *
192a0 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77  * a copy of iRow
192b0 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  id (which will b
192c0 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20  ecome the first 
192d0 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78  rowid on the nex
192e0 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69  t.      ** docli
192f0 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st-index leaf pa
19300 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20  ge) up into the 
19310 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68  next level of th
19320 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20  e b-tree .      
19330 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66  ** hierarchy. If
19340 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20   the node being 
19350 66 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65  flushed is curre
19360 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f  ntly the root no
19370 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73  de,.      ** als
19380 6f 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74  o push its first
19390 20 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20   rowid upwards. 
193a0 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  */.      pDlidx-
193b0 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31  >buf.p[0] = 0x01
193c0 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20  ;    /* Not the 
193d0 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20  root node */.   
193e0 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
193f0 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
19400 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
19410 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
19420 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f   i, pDlidx->pgno
19430 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c  ),.          pDl
19440 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69  idx->buf.p, pDli
19450 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20  dx->buf.n.      
19460 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
19470 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70  teDlidxGrow(p, p
19480 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20  Writer, i+2);.  
19490 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57      pDlidx = &pW
194a0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
194b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
194c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
194d0 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d  pDlidx[1].buf.n=
194e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  =0 ){.        i6
194f0 34 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44  4 iFirst = fts5D
19500 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74  lidxExtractFirst
19510 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62  Rowid(&pDlidx->b
19520 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  uf);..        /*
19530 20 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f   This was the ro
19540 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74  ot node. Push it
19550 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70  s first rowid up
19560 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   to the new root
19570 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c  . */.        pDl
19580 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44  idx[1].pgno = pD
19590 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  lidx->pgno;.    
195a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
195b0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
195c0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
195d0 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20  x[1].buf, 0);.  
195e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
195f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
19600 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
19610 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69  idx[1].buf, pDli
19620 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  dx->pgno);.     
19630 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
19640 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19650 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
19660 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29  [1].buf, iFirst)
19670 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
19680 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d  [1].bPrevValid =
19690 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69   1;.        pDli
196a0 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46  dx[1].iPrev = iF
196b0 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  irst;.      }.. 
196c0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
196d0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69  BufferZero(&pDli
196e0 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20  dx->buf);.      
196f0 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
19700 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44  id = 0;.      pD
19710 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20  lidx->pgno++;.  
19720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
19730 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Done = 1;.    }.
19740 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
19750 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20  >bPrevValid ){. 
19760 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77       iVal = iRow
19770 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72  id - pDlidx->iPr
19780 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
19790 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d       i64 iPgno =
197a0 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72   (i==0 ? pWriter
197b0 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20  ->writer.pgno : 
197c0 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29  pDlidx[-1].pgno)
197d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
197e0 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30  pDlidx->buf.n==0
197f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
19800 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
19810 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
19820 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62  &pDlidx->buf, !b
19830 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Done);.      sql
19840 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
19850 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
19860 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
19870 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   iPgno);.      i
19880 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  Val = iRowid;.  
19890 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
198a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
198b0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
198c0 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61  pDlidx->buf, iVa
198d0 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e  l);.    pDlidx->
198e0 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a  bPrevValid = 1;.
198f0 20 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65      pDlidx->iPre
19900 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  v = iRowid;.  }.
19910 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
19920 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
19930 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
19940 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
19950 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69  Writer){.  stati
19960 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b  c const u8 zero[
19970 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30  ] = { 0x00, 0x00
19980 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a  , 0x00, 0x00 };.
19990 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
199a0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
199b0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36  er->writer;.  i6
199c0 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73  4 iRowid;..  ass
199d0 65 72 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69  ert( (pPage->pgi
199e0 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74  dx.n==0)==(pWrit
199f0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
19a00 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  Page) );..  /* S
19a10 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65  et the szLeaf he
19a20 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  ader field. */. 
19a30 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35   assert( 0==fts5
19a40 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  GetU16(&pPage->b
19a50 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74  uf.p[2]) );.  ft
19a60 73 35 50 75 74 55 31 36 28 26 70 50 61 67 65 2d  s5PutU16(&pPage-
19a70 3e 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29  >buf.p[2], (u16)
19a80 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a  pPage->buf.n);..
19a90 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
19aa0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
19ab0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72  ){.    /* No ter
19ac0 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  m was written to
19ad0 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20   this page. */. 
19ae0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19af0 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a  ->pgidx.n==0 );.
19b00 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
19b10 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69  eeNoTerm(p, pWri
19b20 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ter);.  }else{. 
19b30 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
19b40 20 70 67 69 64 78 20 74 6f 20 74 68 65 20 70 61   pgidx to the pa
19b50 67 65 20 62 75 66 66 65 72 2e 20 53 65 74 20 74  ge buffer. Set t
19b60 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72  he szLeaf header
19b70 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66   field. */.    f
19b80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
19b90 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
19ba0 67 65 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e  ge->buf, pPage->
19bb0 70 67 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e  pgidx.n, pPage->
19bc0 70 67 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20  pgidx.p);.  }.. 
19bd0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
19be0 67 65 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a  ge out to disk *
19bf0 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53  /.  iRowid = FTS
19c00 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
19c10 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
19c20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
19c30 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
19c40 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
19c50 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
19c60 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
19c70 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
19c80 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
19c90 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
19ca0 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
19cb0 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
19cc0 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35  ->pgidx);.  fts5
19cd0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
19ce0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19cf0 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a  >buf, 4, zero);.
19d00 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67    pPage->iPrevPg
19d10 69 64 78 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  idx = 0;.  pPage
19d20 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  ->pgno++;..  /* 
19d30 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c 65 61  Increase the lea
19d40 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e  ves written coun
19d50 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  ter */.  pWriter
19d60 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b  ->nLeafWritten++
19d70 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  ;..  /* The new 
19d80 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65  leaf holds no te
19d90 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f  rms or rowids */
19da0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
19db0 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31  stTermInPage = 1
19dc0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
19dd0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
19de0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   1;.}../*.** App
19df0 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e  end term pTerm/n
19e00 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d  Term to the segm
19e10 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74 65  ent being writte
19e20 6e 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20  n by the writer 
19e30 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
19e40 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
19e50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
19e60 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
19e70 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
19e80 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
19e90 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
19ea0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
19eb0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
19ec0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
19ed0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
19ee0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
19ef0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19f00 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
19f10 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
19f20 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75  t nTerm, const u
19f30 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69  8 *pTerm .){.  i
19f40 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f60 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65 66 69  * Bytes of prefi
19f70 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f  x compression fo
19f80 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35  r term */.  Fts5
19f90 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
19fa0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
19fb0 69 74 65 72 3b 0a 20 20 46 74 73 35 42 75 66 66  iter;.  Fts5Buff
19fc0 65 72 20 2a 70 50 67 69 64 78 20 3d 20 26 70 57  er *pPgidx = &pW
19fd0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
19fe0 69 64 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  idx;..  assert( 
19ff0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a010 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b  age->buf.n>=4 );
1a020 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a030 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57 72  ->buf.n>4 || pWr
1a040 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1a050 49 6e 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a 20  InPage );..  /* 
1a060 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  If the current l
1a070 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c  eaf page is full
1a080 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69  , flush it to di
1a090 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  sk. */.  if( (pP
1a0a0 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 67  age->buf.n + pPg
1a0b0 69 64 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b  idx->n + nTerm +
1a0c0 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d   2)>=p->pConfig-
1a0d0 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 66 28  >pgsz ){.    if(
1a0e0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20   pPage->buf.n>4 
1a0f0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1a100 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1a110 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1a120 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f     fts5BufferGro
1a130 77 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  w(&p->rc, &pPage
1a140 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54 53  ->buf, nTerm+FTS
1a150 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b  5_DATA_PADDING);
1a160 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f 44  .  }.  .  /* TOD
1a170 4f 31 3a 20 55 70 64 61 74 69 6e 67 20 70 67 69  O1: Updating pgi
1a180 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70 50  dx here. */.  pP
1a190 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  gidx->n += sqlit
1a1a0 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
1a1b0 0a 20 20 20 20 20 20 26 70 50 67 69 64 78 2d 3e  .      &pPgidx->
1a1c0 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50  p[pPgidx->n], pP
1a1d0 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61  age->buf.n - pPa
1a1e0 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 0a 20  ge->iPrevPgidx. 
1a1f0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72   );.  pPage->iPr
1a200 65 76 50 67 69 64 78 20 3d 20 70 50 61 67 65 2d  evPgidx = pPage-
1a210 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20 20  >buf.n;.#if 0.  
1a220 66 74 73 35 50 75 74 55 31 36 28 26 70 50 67 69  fts5PutU16(&pPgi
1a230 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d  dx->p[pPgidx->n]
1a240 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
1a250 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20  .  pPgidx->n += 
1a260 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  2;.#endif..  if(
1a270 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1a280 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20  TermInPage ){.  
1a290 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20    nPrefix = 0;. 
1a2a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
1a2b0 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  no!=1 ){.      /
1a2c0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69  * This is the fi
1a2d0 72 73 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c 65  rst term on a le
1a2e0 61 66 20 74 68 61 74 20 69 73 20 6e 6f 74 20 74  af that is not t
1a2f0 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61 66  he leftmost leaf
1a300 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   in.      ** the
1a310 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e   segment b-tree.
1a320 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
1a330 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1a340 20 61 64 64 20 61 20 74 65 72 6d 20 74 6f 0a 20   add a term to. 
1a350 20 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72       ** the b-tr
1a360 65 65 20 68 69 65 72 61 72 63 68 79 20 74 68 61  ee hierarchy tha
1a370 74 20 69 73 20 28 61 29 20 6c 61 72 67 65 72 20  t is (a) larger 
1a380 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
1a390 20 74 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a 20   term .      ** 
1a3a0 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
1a3b0 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 61  to the segment a
1a3c0 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65 72 20 74  nd (b) smaller t
1a3d0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a  han or equal to.
1a3e0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 74 65        ** this te
1a3f0 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  rm. In other wor
1a400 64 73 2c 20 61 20 70 72 65 66 69 78 20 6f 66 20  ds, a prefix of 
1a410 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74 68  (pTerm/nTerm) th
1a420 61 74 20 69 73 20 6f 6e 65 0a 20 20 20 20 20 20  at is one.      
1a430 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74  ** byte longer t
1a440 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74 20  han the longest 
1a450 70 72 65 66 69 78 20 28 70 54 65 72 6d 2f 6e 54  prefix (pTerm/nT
1a460 65 72 6d 29 20 73 68 61 72 65 73 20 77 69 74 68  erm) shares with
1a470 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72   the.      ** pr
1a480 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20 20  evious term. .  
1a490 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a4a0 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 72 65  Usually, the pre
1a4b0 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 61 76  vious term is av
1a4c0 61 69 6c 61 62 6c 65 20 69 6e 20 70 50 61 67 65  ailable in pPage
1a4d0 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65 78 63 65  ->term. The exce
1a4e0 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ption.      ** i
1a4f0 73 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  s if this is the
1a500 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69 74   first term writ
1a510 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65 6d  ten in an increm
1a520 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73 74 65 70  ental-merge step
1a530 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
1a540 69 73 20 63 61 73 65 20 74 68 65 20 70 72 65 76  is case the prev
1a550 69 6f 75 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  ious term is not
1a560 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20 6a   available, so j
1a570 75 73 74 20 77 72 69 74 65 20 61 0a 20 20 20 20  ust write a.    
1a580 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70 54    ** copy of (pT
1a590 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f 20  erm/nTerm) into 
1a5a0 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e  the parent node.
1a5b0 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c   This is slightl
1a5c0 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 65 66 66  y.      ** ineff
1a5d0 69 63 69 65 6e 74 2c 20 62 75 74 20 73 74 69 6c  icient, but stil
1a5e0 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a 20  l correct.  */. 
1a5f0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54 65       int n = nTe
1a600 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  rm;.      if( pP
1a610 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20  age->term.n ){. 
1a620 20 20 20 20 20 20 20 6e 20 3d 20 31 20 2b 20 66         n = 1 + f
1a630 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
1a640 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  s(pPage->term.n,
1a650 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
1a660 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1a670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
1a680 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
1a690 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20 70  p, pWriter, n, p
1a6a0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 50 61  Term);.      pPa
1a6b0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1a6c0 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  riter;.    }.  }
1a6d0 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69  else{.    nPrefi
1a6e0 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  x = fts5PrefixCo
1a6f0 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
1a700 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
1a710 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
1a720 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  m);.    fts5Buff
1a730 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1a740 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1a750 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
1a760 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1a770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1a780 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
1a790 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
1a7a0 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
1a7b0 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
1a7c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1a7d0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1a7e0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
1a7f0 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
1a800 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1a810 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1a820 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1a830 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
1a840 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
1a850 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
1a860 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
1a870 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
1a880 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1a890 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
1a8a0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1a8b0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1a8c0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1a8d0 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  0;..  pWriter->b
1a8e0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1a8f0 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 0;.  pWriter-
1a900 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1a910 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73  clist = 1;..  as
1a920 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28  sert( p->rc || (
1a930 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
1a940 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
1a950 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[0].buf.n==0
1a960 29 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ) );.  pWriter->
1a970 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d  aDlidx[0].pgno =
1a980 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a   pPage->pgno;.}.
1a990 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1a9a0 72 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69  rowid and positi
1a9b0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1a9c0 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72  ld to the writer
1a9d0 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74  s output. .*/.st
1a9e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1a9f0 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  iteAppendRowid(.
1aa00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1aa10 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1aa20 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34   *pWriter,.  i64
1aa30 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28   iRowid.){.  if(
1aa40 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1aa50 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
1aa60 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1aa70 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1aa80 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61  r;..    if( (pPa
1aa90 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
1aaa0 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e  e->pgidx.n)>=p->
1aab0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1aac0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1aad0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1aae0 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iter);.    }..  
1aaf0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1ab00 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
1ab10 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f  rowid written to
1ab20 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
1ab30 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  he .    ** rowid
1ab40 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
1ab50 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
1ab60 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
1ab70 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
1ab80 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
1ab90 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
1aba0 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
1abb0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
1abc0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1abd0 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1abe0 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
1abf0 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29  ge->buf.p, (u16)
1ac00 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
1ac10 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1ac20 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72  idxAppend(p, pWr
1ac30 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
1ac40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
1ac50 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f  te the rowid. */
1ac60 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1ac70 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1ac80 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65  oclist || pWrite
1ac90 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1aca0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
1acb0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1acc0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1acd0 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
1ace0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1acf0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
1ad00 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69  c || iRowid>pWri
1ad10 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
1ad20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1ad30 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1ad40 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1ad50 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57  buf, iRowid - pW
1ad60 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1ad70 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
1ad80 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1ad90 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
1ada0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1adb0 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1adc0 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  0;.    pWriter->
1add0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1ade0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  e = 0;.  }.}..st
1adf0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1ae00 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
1ae10 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65  Data(.  Fts5Inde
1ae20 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1ae30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1ae40 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44   .  const u8 *aD
1ae50 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74  ata, .  int nDat
1ae60 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57  a.){.  Fts5PageW
1ae70 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1ae80 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1ae90 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d  .  const u8 *a =
1aea0 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20   aData;.  int n 
1aeb0 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73  = nData;.  .  as
1aec0 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
1aed0 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68  ->pgsz>0 );.  wh
1aee0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1aef0 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28  TE_OK .     && (
1af00 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
1af10 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20  Page->pgidx.n + 
1af20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
1af30 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69  pgsz .  ){.    i
1af40 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f  nt nReq = p->pCo
1af50 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61  nfig->pgsz - pPa
1af60 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67  ge->buf.n - pPag
1af70 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20  e->pgidx.n;.    
1af80 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20  int nCopy = 0;. 
1af90 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c     while( nCopy<
1afa0 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36  nReq ){.      i6
1afb0 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e  4 dummy;.      n
1afc0 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65 74 56  Copy += fts5GetV
1afd0 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c  arint(&a[nCopy],
1afe0 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a   (u64*)&dummy);.
1aff0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
1b000 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1b010 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1b020 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20  uf, nCopy, a);. 
1b030 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20     a += nCopy;. 
1b040 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20     n -= nCopy;. 
1b050 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1b060 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1b070 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  );.  }.  if( n>0
1b080 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
1b090 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1b0a0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1b0b0 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  , n, a);.  }.}..
1b0c0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
1b0d0 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
1b0e0 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
1b0f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b100 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
1b110 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
1b120 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
1b130 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
1b140 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
1b150 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
1b160 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1b170 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1b180 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1b190 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1b1a0 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20  nt *pnLeaf      
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b1c0 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
1b1d0 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20 62   leaf pages in b
1b1e0 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  -tree */.){.  in
1b1f0 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67 65 57  t i;.  Fts5PageW
1b200 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26  riter *pLeaf = &
1b210 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1b220 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1b230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1b240 73 73 65 72 74 28 20 70 4c 65 61 66 2d 3e 70 67  ssert( pLeaf->pg
1b250 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  no>=1 );.    if(
1b260 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20   pLeaf->buf.n>4 
1b270 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1b280 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1b290 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1b2a0 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65     *pnLeaf = pLe
1b2b0 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20  af->pgno-1;.    
1b2c0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
1b2d0 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b  ree(p, pWriter);
1b2e0 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
1b2f0 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65  rFree(&pLeaf->te
1b300 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
1b310 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75  rFree(&pLeaf->bu
1b320 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
1b330 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69  Free(&pLeaf->pgi
1b340 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
1b350 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e  rFree(&pWriter->
1b360 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28  btterm);..  for(
1b370 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1b380 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1b390 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1b3a0 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72  ferFree(&pWriter
1b3b0 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29  ->aDlidx[i].buf)
1b3c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1b3d0 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
1b3e0 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  lidx);.}..static
1b3f0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
1b400 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
1b410 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1b420 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
1b430 0a 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b  .  int iSegid.){
1b440 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
1b450 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  ffer = p->pConfi
1b460 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  g->pgsz + FTS5_D
1b470 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20  ATA_PADDING;..  
1b480 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
1b490 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
1b4a0 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72  gWriter));.  pWr
1b4b0 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69  iter->iSegid = i
1b4c0 53 65 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72  Segid;..  fts5Wr
1b4d0 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20  iteDlidxGrow(p, 
1b4e0 70 57 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70  pWriter, 1);.  p
1b4f0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1b500 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  gno = 1;.  pWrit
1b510 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1b520 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
1b530 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31  ter->iBtPage = 1
1b540 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  ;..  assert( pWr
1b550 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1b560 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  .n==0 );.  asser
1b570 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  t( pWriter->writ
1b580 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b  er.pgidx.n==0 );
1b590 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20  ..  /* Grow the 
1b5a0 74 77 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70  two buffers to p
1b5b0 67 73 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79  gsz + padding by
1b5c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
1b5d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1b5e0 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
1b5f0 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1b600 2e 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29  .pgidx, nBuffer)
1b610 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
1b620 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
1b630 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  , &pWriter->writ
1b640 65 72 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29  er.buf, nBuffer)
1b650 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78  ;..  if( p->pIdx
1b660 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
1b670 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1b680 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
1b690 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
1b6a0 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
1b6b0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73  p->pIdxWriter, s
1b6c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1b6d0 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1b6e0 54 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f  T INTO '%q'.'%q_
1b6f0 69 64 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c  idx'(segid,term,
1b700 70 67 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f  pgno) VALUES(?,?
1b710 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ,?)", .         
1b720 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
1b730 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
1b740 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28    ));.  }..  if(
1b750 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b760 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  K ){.    /* Init
1b770 69 61 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74  ialize the 4-byt
1b780 65 20 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64  e leaf-page head
1b790 65 72 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20  er to 0x00. */. 
1b7a0 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65     memset(pWrite
1b7b0 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c  r->writer.buf.p,
1b7c0 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69   0, 4);.    pWri
1b7d0 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e  ter->writer.buf.
1b7e0 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42  n = 4;..    /* B
1b7f0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1b800 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
1b810 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77  d to the index-w
1b820 72 69 74 65 72 2e 20 54 68 69 73 20 69 73 20 61  riter. This is a
1b830 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a  n.    ** optimiz
1b840 61 74 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69  ation over bindi
1b850 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ng the same valu
1b860 65 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20  e over and over 
1b870 61 73 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20  as rows are.    
1b880 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
1b890 20 25 5f 69 64 78 20 62 79 20 74 68 65 20 63 75   %_idx by the cu
1b8a0 72 72 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a  rrent writer.  *
1b8b0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
1b8c0 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72  nd_int(p->pIdxWr
1b8d0 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72  iter, 1, pWriter
1b8e0 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d  ->iSegid);.  }.}
1b8f0 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
1b900 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20   pIter was used 
1b910 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1b920 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  gh the input seg
1b930 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a  ments of on an.*
1b940 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * incremental me
1b950 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  rge operation. T
1b960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b970 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e  called if the in
1b980 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72  cremental.** mer
1b990 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69  ge step has fini
1b9a0 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70  shed but the inp
1b9b0 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ut has not been 
1b9c0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75  completely exhau
1b9d0 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
1b9e0 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67  void fts5TrimSeg
1b9f0 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20  ments(Fts5Index 
1ba00 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65  *p, Fts5IndexIte
1ba10 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
1ba20 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   i;.  Fts5Buffer
1ba30 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
1ba40 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
1ba50 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66  ts5Buffer));.  f
1ba60 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1ba70 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
1ba80 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1ba90 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
1baa0 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  g[i];.    if( pS
1bab0 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20  eg->pSeg==0 ){. 
1bac0 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
1bad0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1bae0 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b  Seg->pLeaf==0 ){
1baf0 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65  .      /* All ke
1bb00 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70  ys from this inp
1bb10 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20  ut segment have 
1bb20 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20  been transfered 
1bb30 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20  to the output.. 
1bb40 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68       ** Set both
1bb50 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c   the first and l
1bb60 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ast page-numbers
1bb70 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
1bb80 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
1bb90 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e   ** segment is n
1bba0 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  ow empty. */.   
1bbb0 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1bbc0 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20  gnoLast = 0;.   
1bbd0 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1bbe0 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  gnoFirst = 0;.  
1bbf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1bc00 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e  nt iOff = pSeg->
1bc10 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
1bc20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1bc30 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66  n new first leaf
1bc40 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
1bc50 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20  64 iLeafRowid;. 
1bc60 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
1bc70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  Data;.      int 
1bc80 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67  iId = pSeg->pSeg
1bc90 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ->iSegid;.      
1bca0 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78  u8 aHdr[4] = {0x
1bcb0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
1bcc0 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c  0x00};..      iL
1bcd0 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  eafRowid = FTS5_
1bce0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1bcf0 64 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65  d, pSeg->iTermLe
1bd00 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  afPgno);.      p
1bd10 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
1bd20 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ead(p, iLeafRowi
1bd30 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  d);.      if( pD
1bd40 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ata ){.        f
1bd50 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62  ts5BufferZero(&b
1bd60 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
1bd70 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1bd80 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1bd90 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  >nn);.        ft
1bda0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1bdb0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1bdc0 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
1bdd0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
1bde0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1bdf0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1be00 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
1be10 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1be20 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1be30 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1be40 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
1be50 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
1be60 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1be70 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1be80 62 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65  buf, pData->szLe
1be90 61 66 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d  af-iOff, &pData-
1bea0 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  >p[iOff]);.     
1beb0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1bec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bed0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1bee0 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a  szLeaf field */.
1bef0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75            fts5Pu
1bf00 74 55 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20  tU16(&buf.p[2], 
1bf10 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20  (u16)buf.n);.   
1bf20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1bf30 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e 65  /* Set up the ne
1bf40 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72 72  w page-index arr
1bf50 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ay */.        ft
1bf60 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1bf70 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1bf80 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69  f, 4);.        i
1bf90 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67  f( pSeg->iLeafPg
1bfa0 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72 6d 4c  no==pSeg->iTermL
1bfb0 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20 20 20  eafPgno .       
1bfc0 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f    && pSeg->iEndo
1bfd0 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e  fDoclist<pData->
1bfe0 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20 20  szLeaf .        
1bff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1c000 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61 2d 3e   nDiff = pData->
1c010 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69  szLeaf - pSeg->i
1c020 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20  EndofDoclist;.  
1c030 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1c040 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1c050 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62 75 66  p->rc, &buf, buf
1c060 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66 20 2d  .n - 1 - nDiff -
1c070 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   4);.          f
1c080 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1c090 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1c0a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1c0b0 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70 53 65   pData->nn - pSe
1c0c0 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20 26 70  g->iPgidxOff, &p
1c0d0 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e 69 50  Data->p[pSeg->iP
1c0e0 67 69 64 78 4f 66 66 5d 0a 20 20 20 20 20 20 20  gidxOff].       
1c0f0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
1c100 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1c110 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
1c120 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
1c130 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1c140 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1c150 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74  Pgno;.        ft
1c160 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
1c170 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1c180 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c 65 61  ID(iId, 1), iLea
1c190 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  fRowid);.       
1c1a0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1c1b0 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75  , iLeafRowid, bu
1c1c0 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
1c1d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c1e0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1c1f0 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  &buf);.}..static
1c200 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43   void fts5MergeC
1c210 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20  hunkCallback(.  
1c220 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1c230 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
1c240 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
1c250 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
1c260 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1c270 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  *pWriter = (Fts5
1c280 53 65 67 57 72 69 74 65 72 2a 29 70 43 74 78 3b  SegWriter*)pCtx;
1c290 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65  .  fts5WriteAppe
1c2a0 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c  ndPoslistData(p,
1c2b0 20 70 57 72 69 74 65 72 2c 20 70 43 68 75 6e 6b   pWriter, pChunk
1c2c0 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a  , nChunk);.}../*
1c2d0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
1c2e0 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67  id fts5IndexMerg
1c2f0 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e  eLevel(.  Fts5In
1c300 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c320 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c330 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1c340 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
1c350 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1c360 20 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64   Stucture of ind
1c370 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  ex */.  int iLvl
1c380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c390 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
1c3a0 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66   to read input f
1c3b0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rom */.  int *pn
1c3c0 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Rem             
1c3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1c3e0 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e  e up to this man
1c3f0 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  y output leaves 
1c400 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
1c410 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
1c420 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74   *ppStruct;.  Ft
1c430 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1c440 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
1c450 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1c460 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1c470 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a  Level *pLvlOut;.
1c480 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
1c490 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20  *pIter = 0;     
1c4a0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
1c4b0 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61   read input data
1c4c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d   */.  int nRem =
1c4d0 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20   pnRem ? *pnRem 
1c4e0 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20  : 0;  /* Output 
1c4f0 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
1c500 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e  to write */.  in
1c510 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20  t nInput;       
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c530 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1c540 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
1c550 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1c560 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
1c570 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
1c580 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1c590 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
1c5a0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73       /* Output s
1c5b0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
1c5c0 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
1c5d0 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20  nt bOldest;     
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c5f0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75  * True if the ou
1c600 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20  tput segment is 
1c610 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20  the oldest */.  
1c620 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
1c630 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
1c640 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  l;..  assert( iL
1c650 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1c660 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1c670 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1c680 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1c690 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1c6a0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1c6b0 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1c6c0 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1c6d0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1c6e0 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
1c6f0 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
1c700 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1c710 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1c720 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
1c730 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
1c740 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
1c750 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53  ->nMerge;.    pS
1c760 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1c770 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1c780 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  g-1];..    fts5W
1c790 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1c7a0 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  ter, pSeg->iSegi
1c7b0 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77  d);.    writer.w
1c7c0 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65  riter.pgno = pSe
1c7d0 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20  g->pgnoLast+1;. 
1c7e0 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67     writer.iBtPag
1c7f0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1c800 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
1c810 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1c820 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1c830 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74  .    /* Extend t
1c840 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1c850 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69   object as requi
1c860 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  red to ensure th
1c870 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
1c880 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20  segment exists. 
1c890 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d  */.    if( iLvl=
1c8a0 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
1c8b0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  -1 ){.      fts5
1c8c0 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1c8d0 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75  l(&p->rc, ppStru
1c8e0 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  ct);.      pStru
1c8f0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1c900 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1c910 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
1c920 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
1c930 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30  ct, iLvl+1, 1, 0
1c940 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1c950 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
1c960 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1c970 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1c980 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1c990 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1c9a0 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  l+1];..    fts5W
1c9b0 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1c9c0 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1c9d0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
1c9e0 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  w segment to the
1c9f0 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f   output level */
1ca00 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
1ca10 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
1ca20 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70  ut->nSeg];.    p
1ca30 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a  LvlOut->nSeg++;.
1ca40 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
1ca50 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65  rst = 1;.    pSe
1ca60 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1ca70 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  id;.    pStruct-
1ca80 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20  >nSegment++;..  
1ca90 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20    /* Read input 
1caa0 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74  from all segment
1cab0 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
1cac0 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70  evel */.    nInp
1cad0 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  ut = pLvl->nSeg;
1cae0 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d  .  }.  bOldest =
1caf0 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d   (pLvlOut->nSeg=
1cb00 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e  =1 && pStruct->n
1cb10 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a  Level==iLvl+2);.
1cb20 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e  .  assert( iLvl>
1cb30 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35  =0 );.  for(fts5
1cb40 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1cb50 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30  pStruct, 0, 0, 0
1cb60 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
1cb70 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
1cb80 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
1cb90 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
1cba0 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1cbb0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
1cbc0 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
1cbd0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1cbe0 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
1cbf0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1cc00 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1cc10 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
1cc40 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
1cc50 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
1cc60 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
1cc70 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
1cc80 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
1cc90 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e  key annihilation
1cca0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  . */.    if( pSe
1ccb0 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26  gIter->nPos==0 &
1ccc0 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53  & (bOldest || pS
1ccd0 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29  egIter->bDel==0)
1cce0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1ccf0 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75    pTerm = fts5Mu
1cd00 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
1cd10 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  r, &nTerm);.    
1cd20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
1cd30 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
1cd40 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
1cd50 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1cd60 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e  nRem && writer.n
1cd70 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d  LeafWritten>nRem
1cd80 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1cd90 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1cda0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1cdb0 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
1cdc0 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
1cdd0 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
1cde0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1cdf0 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77  AppendTerm(p, &w
1ce00 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54  riter, nTerm, pT
1ce10 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35  erm);.      fts5
1ce20 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1ce30 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
1ce40 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  pTerm);.    }.. 
1ce50 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
1ce60 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75   rowid to the ou
1ce70 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57  tput */.    /* W
1ce80 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
1ce90 2a 2f 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  */.    fts5Write
1cea0 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26  AppendRowid(p, &
1ceb0 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74  writer, fts5Mult
1cec0 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
1ced0 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  ));..    if( eDe
1cee0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
1cef0 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
1cf00 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 62 44  if( pSegIter->bD
1cf10 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  el ){.        ft
1cf20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1cf30 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
1cf40 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
1cf50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1cf60 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e   pSegIter->nPos>
1cf70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
1cf80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1cf90 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77  arint(&p->rc, &w
1cfa0 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
1cfb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1cfc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1cfd0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65  e{.      /* Appe
1cfe0 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  nd the position-
1cff0 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74 68 65  list data to the
1d000 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20   output */.     
1d010 20 6e 50 6f 73 20 3d 20 70 53 65 67 49 74 65 72   nPos = pSegIter
1d020 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 49  ->nPos*2 + pSegI
1d030 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20  ter->bDel;.     
1d040 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1d050 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d060 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
1d070 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  uf, nPos);.     
1d080 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
1d090 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28  e(p, pSegIter, (
1d0a0 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66  void*)&writer, f
1d0b0 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c  ts5MergeChunkCal
1d0c0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  lback);.    }.  
1d0d0 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
1d0e0 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  e last leaf page
1d0f0 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68   to disk. Set th
1d100 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1d110 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20   b-tree height. 
1d120 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61   ** and last lea
1d130 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74  f page number at
1d140 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
1d150 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46   */.  fts5WriteF
1d160 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
1d170 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  , &pSeg->pgnoLas
1d180 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d  t);..  if( fts5M
1d190 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
1d1a0 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Iter) ){.    int
1d1b0 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   i;..    /* Remo
1d1c0 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1d1d0 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
1d1e0 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
1d1f0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1d200 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a  i<nInput; i++){.
1d210 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
1d220 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  moveSegment(p, p
1d230 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65  Lvl->aSeg[i].iSe
1d240 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gid);.    }..   
1d250 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
1d260 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
1d270 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  s from the input
1d280 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
1d290 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49  ( pLvl->nSeg!=nI
1d2a0 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  nput ){.      in
1d2b0 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d  t nMove = (pLvl-
1d2c0 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20  >nSeg - nInput) 
1d2d0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1d2e0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
1d2f0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c        memmove(pL
1d300 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  vl->aSeg, &pLvl-
1d310 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e  >aSeg[nInput], n
1d320 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Move);.    }.   
1d330 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1d340 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  nt -= nInput;.  
1d350 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20    pLvl->nSeg -= 
1d360 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
1d370 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  ->nMerge = 0;.  
1d380 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
1d390 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
1d3a0 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d   pLvlOut->nSeg--
1d3b0 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
1d3c0 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20  >nSegment--;.   
1d3d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d3e0 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67  assert( pSeg->pg
1d3f0 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20  noLast>0 );.    
1d400 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
1d410 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
1d420 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e  pLvl->nMerge = n
1d430 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74  Input;.  }..  ft
1d440 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
1d450 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73  p, pIter);.  fts
1d460 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
1d470 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20  m);.  if( pnRem 
1d480 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74  ) *pnRem -= writ
1d490 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  er.nLeafWritten;
1d4a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20  .}../*.** Do up 
1d4b0 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20  to nPg pages of 
1d4c0 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f  automerge work o
1d4d0 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n the index..*/.
1d4e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1d4f0 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74  IndexMerge(.  Ft
1d500 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d520 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1d530 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1d540 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
1d550 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
1d560 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
1d570 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
1d580 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20 20  */.  int nPg    
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5a0 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66       /* Pages of
1d5b0 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29   work to do */.)
1d5c0 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  {.  int nRem = n
1d5d0 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  Pg;.  Fts5Struct
1d5e0 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
1d5f0 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c  ppStruct;.  whil
1d600 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e  e( nRem>0 && p->
1d610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d620 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
1d650 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
1d660 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76  .    int iBestLv
1d670 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1d680 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69   /* Level offeri
1d690 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75  ng the most inpu
1d6a0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1d6b0 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b    int nBest = 0;
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d6d0 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1d6e0 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73   segments on bes
1d6f0 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20  t level */..    
1d700 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20  /* Set iBestLvl 
1d710 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20  to the level to 
1d720 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65  read input segme
1d730 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20  nts from. */.   
1d740 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1d750 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
1d760 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1d770 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1d780 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1d790 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1d7a0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1d7b0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1d7c0 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Lvl];.      if( 
1d7d0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
1d7e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
1d7f0 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29  ->nMerge>nBest )
1d800 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73  {.          iBes
1d810 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
1d820 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
1d830 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1d840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
1d850 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1d860 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
1d870 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  eg>nBest ){.    
1d880 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
1d890 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20  ->nSeg;.        
1d8a0 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
1d8b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d8c0 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20      /* If nBest 
1d8d0 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e  is still 0, then
1d8e0 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
1d8f0 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66  be empty. */.#if
1d900 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d910 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
1d920 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76   nBest==0 && iLv
1d930 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1d940 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1d950 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1d960 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1d970 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  nSeg==0 );.    }
1d980 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
1d990 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69   nBest<p->pConfi
1d9a0 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20  g->nAutomerge . 
1d9b0 20 20 20 20 20 20 20 26 26 20 70 53 74 72 75 63         && pStruc
1d9c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
1d9d0 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20  vl].nMerge==0 . 
1d9e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72       ){.      br
1d9f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eak;.    }.    f
1da00 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1da10 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
1da20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29  iBestLvl, &nRem)
1da30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1da40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
1da50 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
1da60 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
1da70 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
1da80 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1da90 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70  p, iBestLvl+1, p
1daa0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
1dab0 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d   }.  *ppStruct =
1dac0 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a   pStruct;.}../*.
1dad0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
1dae0 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
1daf0 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
1db00 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
1db10 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
1db20 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
1db30 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
1db40 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
1db50 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
1db60 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20  f.** necessary, 
1db70 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
1db80 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e  ntal merge work.
1db90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1dba0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
1dbb0 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
1dbc0 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
1dbd0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
1dbe0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1dbf0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1dc00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1dc10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1dc20 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20  ndexAutomerge(. 
1dc30 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1dc60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1dc70 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1dc80 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
1dc90 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1dca0 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1dcb0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  ex */.  int nLea
1dcc0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1dcd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dce0 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76  r of output leav
1dcf0 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  es just written 
1dd00 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
1dd10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dd20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
1dd30 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20  omerge>0 ){.    
1dd40 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1dd50 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1dd60 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69  ct;.    u64 nWri
1dd70 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1dd80 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1dd90 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
1dda0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
1ddb0 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ddd0 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
1dde0 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
1ddf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
1de00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1de20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
1de30 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
1de40 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1de50 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
1de60 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
1de70 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
1de80 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
1de90 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1dea0 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
1deb0 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b  (int)(((nWrite +
1dec0 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
1ded0 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
1dee0 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
1def0 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ));.    pStruct-
1df00 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
1df10 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65  = nLeaf;.    nRe
1df20 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f  m = (int)(p->nWo
1df30 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
1df40 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1df50 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65  );..    fts5Inde
1df60 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75  xMerge(p, ppStru
1df70 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d  ct, nRem);.  }.}
1df80 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1df90 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72  s5IndexCrisismer
1dfa0 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
1dfb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1dfc0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1dfd0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1dfe0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1dff0 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20  **ppStruct      
1e000 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
1e010 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
1e020 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  f index */.){.  
1e030 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69  const int nCrisi
1e040 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  s = p->pConfig->
1e050 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20  nCrisisMerge;.  
1e060 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1e070 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1e080 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d  ct;.  int iLvl =
1e090 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1e0a0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1e0b0 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
1e0c0 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  el>0 );.  while(
1e0d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e0e0 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  K && pStruct->aL
1e0f0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e  evel[iLvl].nSeg>
1e100 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20  =nCrisis ){.    
1e110 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1e120 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
1e130 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61   iLvl, 0);.    a
1e140 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
1e150 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
1e160 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c  ct->nLevel>(iLvl
1e170 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35 53  +1) );.    fts5S
1e180 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1e190 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75  p, iLvl+1, pStru
1e1a0 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b  ct);.    iLvl++;
1e1b0 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
1e1c0 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73   = pStruct;.}..s
1e1d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
1e1e0 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e  dexReturn(Fts5In
1e1f0 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dex *p){.  int r
1e200 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e  c = p->rc;.  p->
1e210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e230 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1e240 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35  ts5FlushCtx Fts5
1e250 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74  FlushCtx;.struct
1e260 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a   Fts5FlushCtx {.
1e270 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64    Fts5Index *pId
1e280 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  x;.  Fts5SegWrit
1e290 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a  er writer; .};..
1e2a0 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75  /*.** Buffer aBu
1e2b0 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  f[] contains a l
1e2c0 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20  ist of varints, 
1e2d0 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68  all small enough
1e2e0 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20   to fit.** in a 
1e2f0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
1e300 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1e310 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70  of the largest p
1e320 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a  refix of this .*
1e330 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65  * list nMax byte
1e340 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a  s or less in siz
1e350 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e360 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
1e370 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75  ix(const u8 *aBu
1e380 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20  f, int nMax){.  
1e390 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64  int ret;.  u32 d
1e3a0 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74  ummy;.  ret = ft
1e3b0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42  s5GetVarint32(aB
1e3c0 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66  uf, dummy);.  if
1e3d0 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20  ( ret<nMax ){.  
1e3e0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1e3f0 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35      int i = fts5
1e400 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75  GetVarint32(&aBu
1e410 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a  f[ret], dummy);.
1e420 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20 2b        if( (ret +
1e430 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65   i) > nMax ) bre
1e440 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b 3d  ak;.      ret +=
1e450 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
1e460 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
1e470 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63  *.** Flush the c
1e480 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65  ontents of in-me
1e490 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20  mory hash table 
1e4a0 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c  iHash to a new l
1e4b0 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65  evel-0 .** segme
1e4c0 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f  nt on disk. Also
1e4d0 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72   update the corr
1e4e0 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74  esponding struct
1e4f0 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  ure record..**.*
1e500 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1e510 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
1e520 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
1e530 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
1e540 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
1e550 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1e560 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1e570 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1e580 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f   void fts5FlushO
1e590 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78  neHash(Fts5Index
1e5a0 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68   *p){.  Fts5Hash
1e5b0 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61   *pHash = p->pHa
1e5c0 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  sh;.  Fts5Struct
1e5d0 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
1e5e0 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e  int iSegid;.  in
1e5f0 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20  t pgnoLast = 0; 
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67  /* Last leaf pag
1e620 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d  e number in segm
1e630 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  ent */..  /* Obt
1e640 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
1e650 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  to the index str
1e660 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63  ucture and alloc
1e670 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e  ate a new segmen
1e680 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  t-id.  ** for th
1e690 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65  e new level-0 se
1e6a0 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74  gment.  */.  pSt
1e6b0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1e6c0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69  tureRead(p);.  i
1e6d0 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f  Segid = fts5Allo
1e6e0 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74  cateSegid(p, pSt
1e6f0 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53  ruct);..  if( iS
1e700 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73  egid ){.    cons
1e710 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e  t int pgsz = p->
1e720 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20  pConfig->pgsz;. 
1e730 20 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d     int eDetail =
1e740 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
1e750 74 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53 74  tail;.    Fts5St
1e760 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1e770 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73  pSeg;   /* New s
1e780 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53  egment within pS
1e790 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73  truct */.    Fts
1e7a0 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1e7c0 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
1e7d0 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70   assemble leaf p
1e7e0 61 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42  age */.    Fts5B
1e7f0 75 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20  uffer *pPgidx;  
1e800 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1e810 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61  er in which to a
1e820 73 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f  ssemble pgidx */
1e830 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69  ..    Fts5SegWri
1e840 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20  ter writer;.    
1e850 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
1e860 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64   &writer, iSegid
1e870 29 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26  );..    pBuf = &
1e880 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
1e890 66 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20  f;.    pPgidx = 
1e8a0 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70  &writer.writer.p
1e8b0 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74  gidx;..    /* ft
1e8c0 73 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68  s5WriteInit() sh
1e8d0 6f 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61  ould have initia
1e8e0 6c 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72  lized the buffer
1e8f0 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c  s to (most likel
1e900 79 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61  y).    ** the ma
1e910 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
1e920 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ired. */.    ass
1e930 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42  ert( p->rc || pB
1e940 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73  uf->nSpace>=(pgs
1e950 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
1e960 44 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73  DDING) );.    as
1e970 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70  sert( p->rc || p
1e980 50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28  Pgidx->nSpace>=(
1e990 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41  pgsz + FTS5_DATA
1e9a0 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20  _PADDING) );..  
1e9b0 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e    /* Begin scann
1e9c0 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68  ing through hash
1e9d0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20   table entries. 
1e9e0 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  This loop runs o
1e9f0 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20  nce for each.   
1ea00 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74   ** term/doclist
1ea10 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1ea20 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73  d within the has
1ea30 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
1ea40 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1ea50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1ea60 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
1ea70 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48  5HashScanInit(pH
1ea80 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ash, 0, 0);.    
1ea90 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  }.    while( p->
1eaa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1eab0 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48   0==sqlite3Fts5H
1eac0 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68  ashScanEof(pHash
1ead0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
1eae0 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
1eaf0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1eb00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
1eb10 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1eb20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20  u8 *pDoclist;   
1eb30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1eb40 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20   to doclist for 
1eb50 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
1eb60 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb80 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
1eb90 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  t in bytes */.. 
1eba0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1ebb0 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20  e term for this 
1ebc0 65 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a  entry to disk. *
1ebd0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  /.      sqlite3F
1ebe0 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
1ebf0 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20  (pHash, &zTerm, 
1ec00 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63  &pDoclist, &nDoc
1ec10 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73  list);.      fts
1ec20 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
1ec30 28 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e  (p, &writer, (in
1ec40 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
1ec50 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
1ec60 6d 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  m);..      asser
1ec70 74 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  t( writer.bFirst
1ec80 52 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29  RowidInPage==0 )
1ec90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a  ;.      if( pgsz
1eca0 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  >=(pBuf->n + pPg
1ecb0 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73  idx->n + nDoclis
1ecc0 74 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20  t + 1) ){.      
1ecd0 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
1ece0 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74  doclist will fit
1ecf0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
1ed00 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20  leaf. */.       
1ed10 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1ed20 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
1ed30 70 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69  pDoclist, nDocli
1ed40 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
1ed50 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 52  {.        i64 iR
1ed60 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  owid = 0;.      
1ed70 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
1ed80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
1ed90 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  ff = 0;..       
1eda0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
1edb0 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20  oclist will not 
1edc0 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66  fit on this leaf
1edd0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
1ede0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  .        ** loop
1edf0 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67   iterates throug
1ee00 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74  h the poslists t
1ee10 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
1ee20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20  current .       
1ee30 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f   ** doclist.  */
1ee40 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1ee50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ee60 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73   && iOff<nDoclis
1ee70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
1ee80 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
1ee90 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69  rint(&pDoclist[i
1eea0 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
1eeb0 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
1eec0 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
1eed0 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
1eee0 20 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65         if( write
1eef0 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1ef00 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
1ef10 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70     fts5PutU16(&p
1ef20 42 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36 29  Buf->p[0], (u16)
1ef30 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66  pBuf->n);   /* f
1ef40 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61  irst rowid on pa
1ef50 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ge */.          
1ef60 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
1ef70 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e  ite3Fts5PutVarin
1ef80 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  t(&pBuf->p[pBuf-
1ef90 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  >n], iRowid);.  
1efa0 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72            writer
1efb0 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
1efc0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
1efd0 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
1efe0 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69  dxAppend(p, &wri
1eff0 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  ter, iRowid);.  
1f000 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f010 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d             pBuf-
1f020 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1f030 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  5PutVarint(&pBuf
1f040 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44  ->p[pBuf->n], iD
1f050 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  elta);.         
1f060 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
1f070 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42  ert( pBuf->n<=pB
1f080 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20  uf->nSpace );.. 
1f090 20 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65           if( eDe
1f0a0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
1f0b0 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
1f0c0 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e        if( iOff<n
1f0d0 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c  Doclist && pDocl
1f0e0 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a  ist[iOff]==0 ){.
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
1f100 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d  uf->p[pBuf->n++]
1f110 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1f120 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20      iOff++;.    
1f130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f            if( iO
1f140 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70  ff<nDoclist && p
1f150 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30  Doclist[iOff]==0
1f160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f170 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66      pBuf->p[pBuf
1f180 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  ->n++] = 0;.    
1f190 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
1f1a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1f1b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f1c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1f1d0 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  ( (pBuf->n + pPg
1f1e0 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b  idx->n)>=pgsz ){
1f1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1f200 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1f210 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20  f(p, &writer);. 
1f220 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1f230 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f240 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44            int bD
1f250 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
1f260 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
1f270 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70          int nCop
1f280 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69  y = fts5GetPosli
1f290 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74  stSize(&pDoclist
1f2a0 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
1f2b0 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  bDummy);.       
1f2c0 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50       nCopy += nP
1f2d0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1f2e0 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70  if( (pBuf->n + p
1f2f0 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79  Pgidx->n + nCopy
1f300 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20  ) <= pgsz ){.   
1f310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f320 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74  e entire poslist
1f330 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1f340 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53   current leaf. S
1f350 6f 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20  o copy.         
1f360 20 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e       ** it in on
1f370 65 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20  e go. */.       
1f380 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f390 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1f3a0 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b  pBuf, &pDoclist[
1f3b0 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  iOff], nCopy);. 
1f3c0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1f3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f3e0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f  /* The entire po
1f3f0 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  slist will not f
1f400 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
1f410 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20   So it needs.   
1f420 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
1f430 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20   be broken into 
1f440 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  sections. The on
1f450 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  ly qualification
1f460 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20   being.         
1f470 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63       ** that eac
1f480 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65  h varint must be
1f490 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f   stored contiguo
1f4a0 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  usly.  */.      
1f4b0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38          const u8
1f4c0 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44   *pPoslist = &pD
1f4d0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20  oclist[iOff];.  
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1f4f0 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  iPos = 0;.      
1f500 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
1f510 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f530 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20     int nSpace = 
1f540 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d  pgsz - pBuf->n -
1f550 20 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20   pPgidx->n;.    
1f560 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1f570 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1f580 20 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70         if( (nCop
1f590 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63  y - iPos)<=nSpac
1f5a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1f5b0 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79         n = nCopy
1f5c0 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20   - iPos;.       
1f5d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73    n = fts5Poslis
1f600 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73  tPrefix(&pPoslis
1f610 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29  t[iPos], nSpace)
1f620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f630 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f640 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20      assert( n>0 
1f650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1f660 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
1f670 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1f680 2c 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73  , &pPoslist[iPos
1f690 5d 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  ], n);.         
1f6a0 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e         iPos += n
1f6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f6c0 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b    if( (pBuf->n +
1f6d0 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73   pPgidx->n)>=pgs
1f6e0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
1f6f0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1f700 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
1f710 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  iter);.         
1f720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f730 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
1f740 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b  s>=nCopy ) break
1f750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f760 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1f770 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
1f780 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   += nCopy;.     
1f790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f7a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f7b0 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73  /* TODO2: Doclis
1f7c0 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69  t terminator wri
1f7d0 74 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tten here. */.  
1f7e0 20 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70      /* pBuf->p[p
1f7f0 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27  Buf->n++] = '\0'
1f800 3b 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  ; */.      asser
1f810 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
1f820 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20  ->nSpace );.    
1f830 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1f840 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29  hScanNext(pHash)
1f850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f860 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
1f870 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73  (pHash);.    fts
1f880 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20  5WriteFinish(p, 
1f890 26 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61  &writer, &pgnoLa
1f8a0 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  st);..    /* Upd
1f8b0 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75  ate the Fts5Stru
1f8c0 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69  cture. It is wri
1f8d0 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
1f8e0 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65   database by the
1f8f0 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75  .    ** fts5Stru
1f900 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63  ctureRelease() c
1f910 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  all below.  */. 
1f920 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1f930 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  nLevel==0 ){.   
1f940 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1f950 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  AddLevel(&p->rc,
1f960 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20   &pStruct);.    
1f970 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1f980 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
1f990 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
1f9a0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
1f9b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1f9c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67  OK ){.      pSeg
1f9d0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1f9e0 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74  vel[0].aSeg[ pSt
1f9f0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
1fa00 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20  nSeg++ ];.      
1fa10 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
1fa20 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65  Segid;.      pSe
1fa30 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
1fa40 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
1fa50 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73  noLast = pgnoLas
1fa60 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  t;.      pStruct
1fa70 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20  ->nSegment++;.  
1fa80 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
1fa90 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
1faa0 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  0, pStruct);.  }
1fab0 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74  ..  fts5IndexAut
1fac0 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  omerge(p, &pStru
1fad0 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
1fae0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1faf0 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1fb00 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
1fb10 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72  ureWrite(p, pStr
1fb20 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
1fb30 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1fb40 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
1fb50 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
1fb60 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
1fb70 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1fb80 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1fb90 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
1fba0 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  id fts5IndexFlus
1fbb0 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
1fbc0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20  .  /* Unless it 
1fbd0 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20  is empty, flush 
1fbe0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
1fbf0 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20  o disk */.  if( 
1fc00 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1fc10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1fc20 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70  ->pHash );.    p
1fc30 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1fc40 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73   0;.    fts5Flus
1fc50 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d  hOneHash(p);.  }
1fc60 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
1fc70 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
1fc80 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
1fc90 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1fca0 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
1fcb0 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77  5Structure *pNew
1fcc0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67   = 0;.  int nSeg
1fcd0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1fce0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1fcf0 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
1fd00 46 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72  Flush(p);.  pStr
1fd10 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1fd20 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
1fd30 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
1fd40 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1fd50 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
1fd60 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
1fd70 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
1fd80 20 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20 70   );.    nSeg = p
1fd90 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1fda0 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e 31  ;.    if( nSeg>1
1fdb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
1fdc0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
1fdd0 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20  5Structure);.   
1fde0 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74     nByte += (pSt
1fdf0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20  ruct->nLevel+1) 
1fe00 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1fe10 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20  uctureLevel);.  
1fe20 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35      pNew = (Fts5
1fe30 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
1fe40 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1fe50 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1fe60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1fe70 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73   pNew ){.    Fts
1fe80 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1fe90 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e  *pLvl;.    int n
1fea0 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69  Byte = nSeg * si
1feb0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1fec0 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
1fed0 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70  pNew->nLevel = p
1fee0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31  Struct->nLevel+1
1fef0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66  ;.    pNew->nRef
1ff00 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 1;.    pNew->
1ff10 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20  nWriteCounter = 
1ff20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
1ff30 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c  ounter;.    pLvl
1ff40 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c   = &pNew->aLevel
1ff50 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
1ff60 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  ];.    pLvl->aSe
1ff70 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
1ff80 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
1ff90 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1ffa0 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1ffb0 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61  .    if( pLvl->a
1ffc0 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
1ffd0 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1ffe0 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d     int iSegOut =
1fff0 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c   0;.      for(iL
20000 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
20010 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
20020 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
20030 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
20040 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
20050 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
20060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
20070 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
20080 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
20090 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
200a0 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
200b0 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
200c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
200d0 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
200e0 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
200f0 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
20100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20110 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
20120 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
20130 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
20140 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
20150 20 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d   = pNew->nLevel-
20160 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  1;.    while( p-
20170 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
20180 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  & pNew->aLevel[i
20190 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20  Lvl].nSeg>0 ){. 
201a0 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
201b0 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
201c0 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  IT;.      fts5In
201d0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
201e0 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e   &pNew, iLvl, &n
201f0 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Rem);.    }..   
20200 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
20210 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ite(p, pNew);.  
20220 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
20230 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
20240 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
20250 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
20260 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
20270 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
20280 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
20290 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46  Fts5IndexMerge(F
202a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
202b0 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35   nMerge){.  Fts5
202c0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
202d0 63 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20 3d  ct;..  pStruct =
202e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
202f0 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
20300 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d  ruct && pStruct-
20310 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 66  >nLevel ){.    f
20320 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
20330 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
20340 65 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  e);.    fts5Stru
20350 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53  ctureWrite(p, pS
20360 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74  truct);.  }.  ft
20370 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
20380 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  se(pStruct);..  
20390 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
203a0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74  Return(p);.}..st
203b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
203c0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20  slistCallback(. 
203d0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
203e0 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
203f0 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
20400 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
20410 6b 0a 29 7b 0a 20 20 61 73 73 65 72 74 5f 6e 63  k.){.  assert_nc
20420 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
20430 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
20440 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
20450 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46  afeAppendBlob((F
20460 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74  ts5Buffer*)pCont
20470 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ext, pChunk, nCh
20480 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70  unk);.  }.}..typ
20490 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
204a0 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50  istCallbackCtx P
204b0 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
204c0 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73  x;.struct Poslis
204d0 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20  tCallbackCtx {. 
204e0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
204f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
20500 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
20510 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
20520 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
20530 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
20540 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
20550 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
20560 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74  n */.  int eStat
20570 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20580 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
20590 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ove */.};..typed
205a0 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73  ef struct Poslis
205b0 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73 6c  tOffsetsCtx Posl
205c0 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a 73  istOffsetsCtx;.s
205d0 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66  truct PoslistOff
205e0 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73 35  setsCtx {.  Fts5
205f0 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
20600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20610 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75  ppend to this bu
20620 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ffer */.  Fts5Co
20630 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20  lset *pColset;  
20640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
20650 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
20660 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
20670 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 69    int iRead;.  i
20680 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f  nt iWrite;.};../
20690 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20  *.** TODO: Make 
206a0 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69  this more effici
206b0 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent!.*/.static i
206c0 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  nt fts5IndexCols
206d0 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73 65  etTest(Fts5Colse
206e0 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20  t *pColset, int 
206f0 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
20700 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
20710 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
20720 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
20730 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f  t->aiCol[i]==iCo
20740 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
20750 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20760 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20770 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43  5PoslistOffsetsC
20780 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
20790 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
207a0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
207b0 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
207c0 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
207d0 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
207e0 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c  tx *pCtx = (Posl
207f0 69 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70  istOffsetsCtx*)p
20800 43 6f 6e 74 65 78 74 3b 0a 20 20 61 73 73 65 72  Context;.  asser
20810 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
20820 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
20830 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  0 ){.    int i =
20840 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
20850 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  <nChunk ){.     
20860 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20   int iVal;.     
20870 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
20880 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d  int32(&pChunk[i]
20890 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , iVal);.      i
208a0 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65  Val += pCtx->iRe
208b0 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43  ad - 2;.      pC
208c0 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c  tx->iRead = iVal
208d0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
208e0 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
208f0 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69  pCtx->pColset, i
20900 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
20910 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
20920 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d  pendVarint(pCtx-
20930 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20  >pBuf, iVal + 2 
20940 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b  - pCtx->iWrite);
20950 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69  .        pCtx->i
20960 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20  Write = iVal;.  
20970 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20980 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
20990 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72  ts5PoslistFilter
209a0 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
209b0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69  Index *p, .  voi
209c0 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  d *pContext, .  
209d0 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
209e0 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
209f0 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63    PoslistCallbac
20a00 6b 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f  kCtx *pCtx = (Po
20a10 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
20a20 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 61 73  *)pContext;.  as
20a30 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
20a40 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
20a50 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nk>0 ){.    /* S
20a60 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f  earch through to
20a70 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
20a80 76 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75  varint with valu
20a90 65 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65  e 1. This is the
20aa0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  .    ** start of
20ab0 20 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e   the next column
20ac0 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69  s hits. */.    i
20ad0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
20ae0 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20  t iStart = 0;.. 
20af0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
20b00 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ate==2 ){.      
20b10 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
20b20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
20b30 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69  t32(pChunk, i, i
20b40 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
20b50 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
20b60 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
20b70 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
20b80 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
20b90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74   = 1;.        ft
20ba0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
20bb0 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70  ndVarint(pCtx->p
20bc0 42 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Buf, 1);.      }
20bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
20be0 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a  tx->eState = 0;.
20bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20c00 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68     do {.      wh
20c10 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26  ile( i<nChunk &&
20c20 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31   pChunk[i]!=0x01
20c30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
20c40 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30  e( pChunk[i] & 0
20c50 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  x80 ) i++;.     
20c60 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
20c70 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
20c80 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
20c90 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
20ca0 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
20cb0 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
20cc0 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
20cd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20ce0 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b   if( i<nChunk ){
20cf0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
20d00 6c 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  l;.        iStar
20d10 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69  t = i;.        i
20d20 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
20d30 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20  i>=nChunk ){.   
20d40 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
20d50 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
20d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20d70 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
20d80 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c  int32(pChunk, i,
20d90 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
20da0 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
20db0 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
20dc0 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73  Test(pCtx->pCols
20dd0 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  et, iCol);.     
20de0 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
20df0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
20e00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
20e10 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
20e20 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
20e30 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
20e40 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  art);.          
20e50 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20    iStart = i;.  
20e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20e70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20e80 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b  }while( i<nChunk
20e90 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
20ea0 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
20eb0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
20ec0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
20ed0 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
20ee0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
20ef0 70 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69  pends the positi
20f00 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72  on list data for
20f10 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
20f20 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20  ry to.** buffer 
20f30 70 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f  pBuf. It does no
20f40 74 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  t make a copy of
20f50 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
20f60 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64  st size.** field
20f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20f80 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
20f90 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
20fa0 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74   *p,.  Fts5SegIt
20fb0 65 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35  er *pSeg,.  Fts5
20fc0 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
20fd0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
20fe0 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Buf.){.  if( 0==
20ff0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
21000 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65  p->rc, pBuf, pSe
21010 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20  g->nPos) ){.    
21020 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29  if( pColset==0 )
21030 7b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e  {.      fts5Chun
21040 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
21050 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66  , (void*)pBuf, f
21060 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ts5PoslistCallba
21070 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
21080 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f        if( p->pCo
21090 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
210a0 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20  TS5_DETAIL_FULL 
210b0 29 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69  ){.        Posli
210c0 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43  stCallbackCtx sC
210d0 74 78 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  tx;.        sCtx
210e0 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20  .pBuf = pBuf;.  
210f0 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73        sCtx.pCols
21100 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
21110 20 20 20 20 20 20 73 43 74 78 2e 65 53 74 61 74        sCtx.eStat
21120 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  e = fts5IndexCol
21130 73 65 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c  setTest(pColset,
21140 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
21150 65 72 74 28 20 73 43 74 78 2e 65 53 74 61 74 65  ert( sCtx.eState
21160 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61  ==0 || sCtx.eSta
21170 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  te==1 );.       
21180 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
21190 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
211a0 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73  *)&sCtx, fts5Pos
211b0 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61  listFilterCallba
211c0 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ck);.      }else
211d0 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73  {.        Poslis
211e0 74 4f 66 66 73 65 74 73 43 74 78 20 73 43 74 78  tOffsetsCtx sCtx
211f0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
21200 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
21210 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 20 20  f(sCtx));.      
21220 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42    sCtx.pBuf = pB
21230 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  uf;.        sCtx
21240 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73  .pColset = pCols
21250 65 74 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  et;.        fts5
21260 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
21270 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43  pSeg, (void*)&sC
21280 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 4f  tx, fts5PoslistO
21290 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b  ffsetsCallback);
212a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
212b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f   }.}../*.** IN/O
212c0 55 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  UT parameter (*p
212d0 61 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70  a) points to a p
212e0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62  osition list n b
212f0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66  ytes in size. If
21300 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  .** the position
21310 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65   list contains e
21320 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d  ntries for colum
21330 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70  n iCol, then (*p
21340 61 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  a) is set.** to 
21350 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62  point to the sub
21360 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66  -position-list f
21370 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  or that column a
21380 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
21390 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20  .** bytes in it 
213a0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
213b0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f   the argument po
213c0 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73  sition list does
213d0 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20   not.** contain 
213e0 61 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20  any entries for 
213f0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74  column iCol, ret
21400 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
21410 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78   int fts5IndexEx
21420 74 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73  tractCol(.  cons
21430 74 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20  t u8 **pa,      
21440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21450 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  N/OUT: Pointer t
21460 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69  o poslist */.  i
21470 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21490 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f  * IN: Size of po
214a0 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  slist in bytes *
214b0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
214e0 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f   extract from po
214f0 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  slist */.){.  in
21500 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21520 20 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65   Anything before
21530 20 74 68 65 20 66 69 72 73 74 20 30 78 30 31 20   the first 0x01 
21540 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f  is col 0 */.  co
21550 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b  nst u8 *p = *pa;
21560 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e  .  const u8 *pEn
21570 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20  d = &p[n];      
21580 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70     /* One byte p
21590 61 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74  ast end of posit
215a0 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 75 38  ion list */.  u8
215b0 20 70 72 65 76 20 3d 20 30 3b 0a 0a 20 20 77 68   prev = 0;..  wh
215c0 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65  ile( iCol>iCurre
215d0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76  nt ){.    /* Adv
215e0 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
215f0 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
21600 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
21610 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
21620 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f     ** not part o
21630 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  f a varint */.  
21640 20 20 77 68 69 6c 65 28 20 28 70 72 65 76 20 26    while( (prev &
21650 20 30 78 38 30 29 20 7c 7c 20 2a 70 21 3d 30 78   0x80) || *p!=0x
21660 30 31 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76  01 ){.      prev
21670 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 20 20 69   = *p++;.      i
21680 66 28 20 70 3d 3d 70 45 6e 64 20 29 20 72 65 74  f( p==pEnd ) ret
21690 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
216a0 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20   *pa = p++;.    
216b0 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
216c0 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74  nt32(p, iCurrent
216d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
216e0 6c 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65  l!=iCurrent ) re
216f0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64  turn 0;..  /* Ad
21700 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20  vance pointer p 
21710 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
21720 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78  to pEnd or an 0x
21730 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a  01 byte that is.
21740 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66    ** not part of
21750 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 61   a varint */.  a
21760 73 73 65 72 74 28 20 28 70 72 65 76 20 26 20 30  ssert( (prev & 0
21770 78 38 30 29 3d 3d 30 20 29 3b 0a 20 20 77 68 69  x80)==0 );.  whi
21780 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 28  le( p<pEnd && ((
21790 70 72 65 76 20 26 20 30 78 38 30 29 20 7c 7c 20  prev & 0x80) || 
217a0 2a 70 21 3d 30 78 30 31 29 20 29 7b 0a 20 20 20  *p!=0x01) ){.   
217b0 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20   prev = *p++;.  
217c0 7d 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28  }.  return p - (
217d0 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  *pa);.}..static 
217e0 69 6e 74 20 66 74 73 35 41 70 70 65 6e 64 52 6f  int fts5AppendRo
217f0 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
21800 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74   *p,.  i64 iDelt
21810 61 2c 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  a,.  Fts5IndexIt
21820 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74  er *pMulti,.  Ft
21830 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
21840 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t,.  Fts5Buffer 
21850 2a 70 42 75 66 0a 29 7b 0a 20 20 66 74 73 35 42  *pBuf.){.  fts5B
21860 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
21870 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  t(&p->rc, pBuf, 
21880 69 44 65 6c 74 61 29 3b 0a 20 20 72 65 74 75 72  iDelta);.  retur
21890 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  n 0;.}../*.** It
218a0 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75  erator pMulti cu
218b0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
218c0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  o a valid entry 
218d0 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a  (not EOF). This.
218e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
218f0 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nds the followin
21900 67 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  g to buffer pBuf
21910 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
21920 76 61 72 69 6e 74 20 69 44 65 6c 74 61 2c 20 61  varint iDelta, a
21930 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 70 6f  nd.**   * the po
21940 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74  sition list that
21950 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
21960 73 20 74 6f 2c 20 69 6e 63 6c 75 64 69 6e 67 20  s to, including 
21970 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 2e 0a  the size field..
21980 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
21990 74 20 70 43 6f 6c 73 65 74 20 69 73 20 4e 55 4c  t pColset is NUL
219a0 4c 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 73 69  L, then the posi
219b0 74 69 6f 6e 20 6c 69 73 74 20 69 73 20 66 69 6c  tion list is fil
219c0 74 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a  tered according.
219d0 2a 2a 20 74 6f 20 70 43 6f 6c 73 65 74 20 62 65  ** to pColset be
219e0 66 6f 72 65 20 62 65 69 6e 67 20 61 70 70 65 6e  fore being appen
219f0 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
21a00 72 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73  r. If this means
21a10 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e 6f   there are.** no
21a20 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
21a30 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20 6e  position list, n
21a40 6f 74 68 69 6e 67 20 69 73 20 61 70 70 65 6e 64  othing is append
21a50 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ed to the buffer
21a60 20 28 6e 6f 74 0a 2a 2a 20 65 76 65 6e 20 69 44   (not.** even iD
21a70 65 6c 74 61 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  elta)..**.** If 
21a80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
21a90 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
21aa0 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e  s left in p->rc.
21ab0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
21ac0 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73  fts5AppendPoslis
21ad0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
21ae0 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c  p,.  i64 iDelta,
21af0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
21b00 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73 35   *pMulti,.  Fts5
21b10 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
21b20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
21b30 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Buf.){.  if( p->
21b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21b50 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
21b60 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69   *pSeg = &pMulti
21b70 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e  ->aSeg[ pMulti->
21b80 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
21b90 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ];.    assert( 
21ba0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
21bb0 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29  (p, pMulti)==0 )
21bc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
21bd0 65 67 2d 3e 6e 50 6f 73 3e 30 20 29 3b 0a 20 20  eg->nPos>0 );.  
21be0 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66    if( 0==fts5Buf
21bf0 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
21c00 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  pBuf, pSeg->nPos
21c10 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 69  +9+9) ){.      i
21c20 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  f( p->pConfig->e
21c30 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
21c40 41 49 4c 5f 46 55 4c 4c 0a 20 20 20 20 20 20 20  AIL_FULL.       
21c50 26 26 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  && pSeg->iLeafOf
21c60 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c  fset+pSeg->nPos<
21c70 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  =pSeg->pLeaf->sz
21c80 4c 65 61 66 20 0a 20 20 20 20 20 20 20 26 26 20  Leaf .       && 
21c90 28 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20 70  (pColset==0 || p
21ca0 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 29  Colset->nCol==1)
21cb0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
21cc0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
21cd0 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
21ce0 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
21cf0 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  fset];.        i
21d00 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
21d10 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 0a   if( pColset ){.
21d20 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 20 3d            nPos =
21d30 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
21d40 74 43 6f 6c 28 26 70 50 6f 73 2c 20 70 53 65 67  tCol(&pPos, pSeg
21d50 2d 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d  ->nPos, pColset-
21d60 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aiCol[0]);.    
21d70 20 20 20 20 20 20 69 66 28 20 6e 50 6f 73 3d 3d        if( nPos==
21d80 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
21d90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21da0 20 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53         nPos = pS
21db0 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 20 20  eg->nPos;.      
21dc0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
21dd0 72 74 28 20 6e 50 6f 73 3e 30 20 29 3b 0a 20 20  rt( nPos>0 );.  
21de0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21df0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
21e00 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a  (pBuf, iDelta);.
21e10 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21e20 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
21e30 6e 74 28 70 42 75 66 2c 20 6e 50 6f 73 2a 32 29  nt(pBuf, nPos*2)
21e40 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
21e50 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
21e60 6f 62 28 70 42 75 66 2c 20 70 50 6f 73 2c 20 6e  ob(pBuf, pPos, n
21e70 50 6f 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Pos);.      }els
21e80 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
21e90 53 76 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Sv1;.        int
21ea0 20 69 53 76 32 3b 0a 20 20 20 20 20 20 20 20 69   iSv2;.        i
21eb0 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 20 20 20  nt iData;..     
21ec0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 69 44 65     /* Append iDe
21ed0 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  lta */.        i
21ee0 53 76 31 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20  Sv1 = pBuf->n;. 
21ef0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
21f00 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
21f10 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  t(pBuf, iDelta);
21f20 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
21f30 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
21f40 0a 20 20 20 20 20 20 20 20 69 53 76 32 20 3d 20  .        iSv2 = 
21f50 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pBuf->n;.       
21f60 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
21f70 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
21f80 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32 29 3b  , pSeg->nPos*2);
21f90 0a 20 20 20 20 20 20 20 20 69 44 61 74 61 20 3d  .        iData =
21fa0 20 70 42 75 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20   pBuf->n;..     
21fb0 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f     fts5SegiterPo
21fc0 73 6c 69 73 74 28 70 2c 20 70 53 65 67 2c 20 70  slist(p, pSeg, p
21fd0 43 6f 6c 73 65 74 2c 20 70 42 75 66 29 3b 0a 0a  Colset, pBuf);..
21fe0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
21ff0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
22000 20 69 6e 74 20 6e 41 63 74 75 61 6c 20 3d 20 70   int nActual = p
22010 42 75 66 2d 3e 6e 20 2d 20 69 44 61 74 61 3b 0a  Buf->n - iData;.
22020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
22030 63 74 75 61 6c 21 3d 70 53 65 67 2d 3e 6e 50 6f  ctual!=pSeg->nPo
22040 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
22050 20 69 66 28 20 6e 41 63 74 75 61 6c 3d 3d 30 20   if( nActual==0 
22060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22070 20 70 42 75 66 2d 3e 6e 20 3d 20 69 53 76 31 3b   pBuf->n = iSv1;
22080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
22090 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
220a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
220b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52            int nR
220c0 65 71 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  eq = sqlite3Fts5
220d0 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 28 75 33  GetVarintLen((u3
220e0 32 29 28 6e 41 63 74 75 61 6c 2a 32 29 29 3b 0a  2)(nActual*2));.
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
22100 69 6c 65 28 20 69 53 76 32 3c 28 69 44 61 74 61  ile( iSv2<(iData
22110 2d 6e 52 65 71 29 20 29 7b 20 70 42 75 66 2d 3e  -nReq) ){ pBuf->
22120 70 5b 69 53 76 32 2b 2b 5d 20 3d 20 30 78 38 30  p[iSv2++] = 0x80
22130 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ; }.            
22140 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74    sqlite3Fts5Put
22150 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
22160 69 53 76 32 5d 2c 20 6e 41 63 74 75 61 6c 2a 32  iSv2], nActual*2
22170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
22180 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
221a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
221b0 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  rn 0;.}...static
221c0 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73   void fts5Doclis
221d0 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f  tIterNext(Fts5Do
221e0 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
221f0 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70 49 74  ){.  u8 *p = pIt
22200 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20 70  er->aPoslist + p
22210 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20 70 49  Iter->nSize + pI
22220 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a  ter->nPoslist;..
22230 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
22240 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20 69  >aPoslist );.  i
22250 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61 45 6f  f( p>=pIter->aEo
22260 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
22270 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
22280 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69  }else{.    i64 i
22290 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20 2b 3d  Delta;..    p +=
222a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
222b0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
222c0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
222d0 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a  wid += iDelta;..
222e0 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f 73 69      /* Read posi
222f0 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 2a  tion list size *
22300 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d 20 26  /.    if( p[0] &
22310 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 69   0x80 ){.      i
22320 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 70  nt nPos;.      p
22330 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 66 74  Iter->nSize = ft
22340 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s5GetVarint32(p,
22350 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 70 49   nPos);.      pI
22360 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
22370 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20 20 7d  (nPos>>1);.    }
22380 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
22390 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 28  r->nPoslist = ((
223a0 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e 20 31  int)(p[0])) >> 1
223b0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
223c0 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Size = 1;.    }.
223d0 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
223e0 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a  list = p;.  }.}.
223f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
22400 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
22410 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
22420 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44 6f 63  pBuf, .  Fts5Doc
22430 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a  listIter *pIter.
22440 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ){.  memset(pIte
22450 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
22460 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
22470 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75 66 2d  aPoslist = pBuf-
22480 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61 45 6f  >p;.  pIter->aEo
22490 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70 42 75  f = &pBuf->p[pBu
224a0 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44 6f 63  f->n];.  fts5Doc
224b0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74  listIterNext(pIt
224c0 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  er);.}..#if 0./*
224d0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
224e0 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
224f0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
22500 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
22510 20 74 68 61 74 20 73 70 61 63 65 20 77 69 74 68   that space with
22520 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 68 61  in the buffer ha
22530 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  s already been.*
22540 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  * allocated..*/.
22550 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
22560 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
22570 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
22580 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
22590 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
225a0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
225b0 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c  64 *piLastRowid,
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
225d0 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f  * IN/OUT: Previo
225e0 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e  us rowid written
225f0 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69   (if any) */.  i
22600 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20  64 iRowid       
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22620 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e  * Rowid to appen
22630 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
22640 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20  ( pBuf->n!=0 || 
22650 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d  (*piLastRowid)==
22660 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  0 );.  fts5Buffe
22670 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
22680 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d  t(pBuf, iRowid -
22690 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a   *piLastRowid);.
226a0 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d    *piLastRowid =
226b0 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69   iRowid;.}.#endi
226c0 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4d  f..#define fts5M
226d0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
226e0 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77 69 64  pBuf, iLastRowid
226f0 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20 20 20  , iRowid) {     
22700 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
22710 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69  Buf)->n!=0 || (i
22720 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b  LastRowid)==0 );
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66 66 65     \.  fts5Buffe
22750 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
22760 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f 77 69  t((pBuf), (iRowi
22770 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77 69 64  d) - (iLastRowid
22780 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74 52 6f  )); \.  (iLastRo
22790 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64 29 3b  wid) = (iRowid);
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20       \.}../*.** 
227d0 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65 6e 74  Swap the content
227e0 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70 31 20  s of buffer *p1 
227f0 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a 70 32  with that of *p2
22800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22810 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
22820 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
22830 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 29 7b  Fts5Buffer *p2){
22840 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d  .  Fts5Buffer tm
22850 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d  p = *p1;.  *p1 =
22860 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d   *p2;.  *p2 = tm
22870 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  p;.}..static voi
22880 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28  d fts5NextRowid(
22890 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
228a0 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20 69 36  , int *piOff, i6
228b0 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20 69  4 *piRowid){.  i
228c0 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b 0a 20  nt i = *piOff;. 
228d0 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e 6e 20   if( i>=pBuf->n 
228e0 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20  ){.    *piOff = 
228f0 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
22900 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 2a   u64 iVal;.    *
22910 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71 6c 69  piOff = i + sqli
22920 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
22930 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20 26 69  (&pBuf->p[i], &i
22940 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52 6f 77  Val);.    *piRow
22950 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a  id += iVal;.  }.
22960 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
22970 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
22980 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  of fts5MergePref
22990 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20 64 65  ixLists() for de
229a0 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a  tail=none mode..
229b0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
229c0 74 68 65 20 62 75 66 66 65 72 73 20 63 6f 6e 73  the buffers cons
229d0 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61 2d 65  ist of a delta-e
229e0 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66 20 72  ncoded list of r
229f0 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  owids only..*/.s
22a00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
22a10 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 28 0a  ergeRowidLists(.
22a20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
22a50 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
22a60 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a80 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
22a90 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
22aa0 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
22ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
22ac0 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
22ad0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 31  e */.){.  int i1
22ae0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32 20 3d   = 0;.  int i2 =
22af0 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
22b00 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f  1 = 0;.  i64 iRo
22b10 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36 34 20  wid2 = 0;.  i64 
22b20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46 74 73  iOut = 0;..  Fts
22b30 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 6d  5Buffer out;.  m
22b40 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73  emset(&out, 0, s
22b50 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 73  izeof(out));.  s
22b60 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
22b70 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75  Size(&p->rc, &ou
22b80 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e  t, p1->n + p2->n
22b90 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
22ba0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35   return;..  fts5
22bb0 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69  NextRowid(p1, &i
22bc0 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20  1, &iRowid1);.  
22bd0 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32  fts5NextRowid(p2
22be0 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29  , &i2, &iRowid2)
22bf0 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e 3d 30  ;.  while( i1>=0
22c00 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20 20 20   || i2>=0 ){.   
22c10 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20 28 69   if( i1>=0 && (i
22c20 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31 3c 69  2<0 || iRowid1<i
22c30 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20 20 20  Rowid2) ){.     
22c40 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30   assert( iOut==0
22c50 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f 75 74   || iRowid1>iOut
22c60 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   );.      fts5Bu
22c70 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
22c80 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69  rint(&out, iRowi
22c90 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20  d1 - iOut);.    
22ca0 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 31    iOut = iRowid1
22cb0 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78 74  ;.      fts5Next
22cc0 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26  Rowid(p1, &i1, &
22cd0 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 7d 65  iRowid1);.    }e
22ce0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
22cf0 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52  t( iOut==0 || iR
22d00 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a 20 20  owid2>iOut );.  
22d10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
22d20 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
22d30 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d 20 69  out, iRowid2 - i
22d40 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74  Out);.      iOut
22d50 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20 20 20   = iRowid2;.    
22d60 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20 69    if( i1>=0 && i
22d70 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64 32 20  Rowid1==iRowid2 
22d80 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e  ){.        fts5N
22d90 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31  extRowid(p1, &i1
22da0 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20  , &iRowid1);.   
22db0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 4e     }.      fts5N
22dc0 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32  extRowid(p2, &i2
22dd0 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 20  , &iRowid2);.   
22de0 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75   }.  }..  fts5Bu
22df0 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c 20 70  fferSwap(&out, p
22e00 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  1);.  fts5Buffer
22e10 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f  Free(&out);.}../
22e20 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31 20  *.** Buffers p1 
22e30 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20 64  and p2 contain d
22e40 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66 75  oclists. This fu
22e50 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68  nction merges th
22e60 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  e content.** of 
22e70 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74 73  the two doclists
22e80 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73 65   together and se
22e90 74 73 20 62 75 66 66 65 72 20 70 31 20 74 6f 20  ts buffer p1 to 
22ea0 74 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72  the result befor
22eb0 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
22ec0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
22ed0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
22ee0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
22ef0 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20  in p->rc. If an 
22f00 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72  error has.** alr
22f10 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
22f20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22f30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
22f40 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
22f50 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20 20  ePrefixLists(.  
22f60 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
22f90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
22fa0 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20  Buffer *p1,     
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22fc0 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72  irst list to mer
22fd0 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
22fe0 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20  er *p2          
22ff0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
23000 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  d list to merge 
23010 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e  */.){.  if( p2->
23020 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61  n ){.    i64 iLa
23030 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
23040 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
23050 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63   i1;.    Fts5Doc
23060 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20  listIter i2;.   
23070 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b   Fts5Buffer out;
23080 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
23090 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  tmp;.    memset(
230a0 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &out, 0, sizeof(
230b0 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  out));.    memse
230c0 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f  t(&tmp, 0, sizeo
230d0 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 73 71  f(tmp));..    sq
230e0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
230f0 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  ize(&p->rc, &out
23100 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29  , p1->n + p2->n)
23110 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
23120 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 26 69  tIterInit(p1, &i
23130 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  1);.    fts5Docl
23140 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20  istIterInit(p2, 
23150 26 69 32 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  &i2);.    while(
23160 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23170 4b 20 26 26 20 28 69 31 2e 61 50 6f 73 6c 69 73  K && (i1.aPoslis
23180 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c  t!=0 || i2.aPosl
23190 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
231a0 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74   if( i2.aPoslist
231b0 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c  ==0 || (i1.aPosl
231c0 69 73 74 20 26 26 20 69 31 2e 69 52 6f 77 69 64  ist && i1.iRowid
231d0 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20  <i2.iRowid) ){. 
231e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
231f0 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a  ntry from i1 */.
23200 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
23210 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
23220 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
23230 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  1.iRowid);.     
23240 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
23250 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
23260 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
23270 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53  1.nPoslist+i1.nS
23280 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ize);.        ft
23290 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
232a0 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i1);.      }.
232b0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
232c0 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  1.aPoslist==0 ||
232d0 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69   i2.iRowid!=i1.i
232e0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
232f0 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
23300 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20  rom i2 */.      
23310 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
23320 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
23330 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
23340 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
23350 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
23360 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61  dBlob(&out, i2.a
23370 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73  Poslist, i2.nPos
23380 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a  list+i2.nSize);.
23390 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
233a0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
233b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
233c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
233d0 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20  4 iPos1 = 0;.   
233e0 20 20 20 20 20 69 36 34 20 69 50 6f 73 32 20 3d       i64 iPos2 =
233f0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
23400 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20 20 20  iOff1 = 0;.     
23410 20 20 20 69 6e 74 20 69 4f 66 66 32 20 3d 20 30     int iOff2 = 0
23420 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 31  ;.        u8 *a1
23430 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b   = &i1.aPoslist[
23440 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20  i1.nSize];.     
23450 20 20 20 75 38 20 2a 61 32 20 3d 20 26 69 32 2e     u8 *a2 = &i2.
23460 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a  aPoslist[i2.nSiz
23470 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 46 74 73  e];..        Fts
23480 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77  5PoslistWriter w
23490 72 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d  riter;.        m
234a0 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
234b0 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
234c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d  );..        /* M
234d0 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73  erge the two pos
234e0 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20  ition lists. */ 
234f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
23500 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
23510 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
23520 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
23530 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
23540 72 6f 28 26 74 6d 70 29 3b 0a 0a 20 20 20 20 20  ro(&tmp);..     
23550 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
23560 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20  slistNext64(a1, 
23570 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i1.nPoslist, &iO
23580 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20  ff1, &iPos1);.  
23590 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
235a0 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
235b0 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  2, i2.nPoslist, 
235c0 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b  &iOff2, &iPos2);
235d0 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ..        while(
235e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
235f0 4b 20 26 26 20 28 69 50 6f 73 31 3e 3d 30 20 7c  K && (iPos1>=0 |
23600 7c 20 69 50 6f 73 32 3e 3d 30 29 20 29 7b 0a 20  | iPos2>=0) ){. 
23610 20 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65           i64 iNe
23620 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  w;.          if(
23630 20 69 50 6f 73 32 3c 30 20 7c 7c 20 28 69 50 6f   iPos2<0 || (iPo
23640 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 31 3c 69  s1>=0 && iPos1<i
23650 50 6f 73 32 29 20 29 7b 0a 20 20 20 20 20 20 20  Pos2) ){.       
23660 20 20 20 20 20 69 4e 65 77 20 3d 20 69 50 6f 73       iNew = iPos
23670 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  1;.            s
23680 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
23690 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
236a0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
236b0 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
236c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
236d0 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 69 50         iNew = iP
236e0 6f 73 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  os2;.           
236f0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
23700 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
23710 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
23720 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
23730 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
23740 31 3d 3d 69 50 6f 73 32 20 29 7b 0a 20 20 20 20  1==iPos2 ){.    
23750 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23760 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
23770 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
23780 73 74 2c 20 26 69 4f 66 66 31 2c 26 69 50 6f 73  st, &iOff1,&iPos
23790 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
237a0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
237b0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
237c0 21 3d 77 72 69 74 65 72 2e 69 50 72 65 76 20 7c  !=writer.iPrev |
237d0 7c 20 74 6d 70 2e 6e 3d 3d 30 20 29 7b 0a 20 20  | tmp.n==0 ){.  
237e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
237f0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
23800 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
23810 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
23820 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  iNew);.         
23830 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
23840 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
23850 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
23860 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
23870 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
23880 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29  &out, tmp.n * 2)
23890 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
238a0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
238b0 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20  ob(&out, tmp.p, 
238c0 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  tmp.n);.        
238d0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
238e0 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
238f0 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
23900 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20  rNext(&i2);.    
23910 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
23920 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
23930 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20  >rc, p1, out.n, 
23940 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35  out.p);.    fts5
23950 42 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29  BufferFree(&tmp)
23960 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
23970 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a  Free(&out);.  }.
23980 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
23990 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
239a0 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er(.  Fts5Index 
239b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
239c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
239d0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
239e0 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a00 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52   /* True for "OR
23a10 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
23a20 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  C" */.  const u8
23a30 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
23a40 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
23a50 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
23a60 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  fix to match */.
23a70 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
23aa0 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79  fer pToken in by
23ab0 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  tes */.  Fts5Col
23ac0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
23ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
23ae0 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
23af0 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f  these columns */
23b00 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
23b10 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20   **ppIter       
23b20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69     /* OUT: New i
23b30 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  terator */.){.  
23b40 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
23b50 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75  Struct;.  Fts5Bu
23b60 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f  ffer *aBuf;.  co
23b70 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33  nst int nBuf = 3
23b80 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 4d 65  2;..  void (*xMe
23b90 72 67 65 29 28 46 74 73 35 49 6e 64 65 78 2a 2c  rge)(Fts5Index*,
23ba0 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 46 74   Fts5Buffer*, Ft
23bb0 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 6e  s5Buffer*);.  in
23bc0 74 20 28 2a 78 41 70 70 65 6e 64 29 28 46 74 73  t (*xAppend)(Fts
23bd0 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c 20 46 74  5Index*, i64, Ft
23be0 73 35 49 6e 64 65 78 49 74 65 72 2a 2c 20 46 74  s5IndexIter*, Ft
23bf0 73 35 43 6f 6c 73 65 74 2a 2c 20 46 74 73 35 42  s5Colset*, Fts5B
23c00 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28 20 70  uffer*);.  if( p
23c10 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
23c20 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
23c30 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d 65 72  NONE ){.    xMer
23c40 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 52 6f  ge = fts5MergeRo
23c50 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20 78 41  widLists;.    xA
23c60 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65  ppend = fts5Appe
23c70 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65  ndRowid;.  }else
23c80 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66  {.    xMerge = f
23c90 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
23ca0 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64  sts;.    xAppend
23cb0 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73   = fts5AppendPos
23cc0 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 42 75  list;.  }..  aBu
23cd0 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a  f = (Fts5Buffer*
23ce0 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
23cf0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
23d00 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53  fer)*nBuf);.  pS
23d10 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
23d20 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20  ctureRead(p);.. 
23d30 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74   if( aBuf && pSt
23d40 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73  ruct ){.    cons
23d50 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54  t int flags = FT
23d60 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
23d70 41 4e 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  AN;.    int i;. 
23d80 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69     i64 iLastRowi
23d90 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 49  d = 0;.    Fts5I
23da0 6e 64 65 78 49 74 65 72 20 2a 70 31 20 3d 20 30  ndexIter *p1 = 0
23db0 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  ;     /* Iterato
23dc0 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72  r used to gather
23dd0 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78   data from index
23de0 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61   */.    Fts5Data
23df0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73   *pData;.    Fts
23e00 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b  5Buffer doclist;
23e10 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72  .    int bNewTer
23e20 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73  m = 1;..    mems
23e30 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20  et(&doclist, 0, 
23e40 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29  sizeof(doclist))
23e50 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75  ;.    for(fts5Mu
23e60 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
23e70 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c  truct, 1, flags,
23e80 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
23e90 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20   -1, 0, &p1);.  
23ea0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
23eb0 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30  terEof(p, p1)==0
23ec0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
23ed0 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c 20  ltiIterNext2(p, 
23ee0 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a 20  p1, &bNewTerm). 
23ef0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20     ){.      i64 
23f00 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c  iRowid = fts5Mul
23f10 74 69 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b  tiIterRowid(p1);
23f20 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
23f30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
23f40 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75   *pTerm = fts5Mu
23f50 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20  ltiIterTerm(p1, 
23f60 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61  &nTerm);.      a
23f70 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70  ssert_nc( memcmp
23f80 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
23f90 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72  MIN(nToken, nTer
23fa0 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20  m))<=0 );.      
23fb0 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
23fc0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72          if( nTer
23fd0 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63  m<nToken || memc
23fe0 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
23ff0 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61  , nToken) ) brea
24000 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
24010 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e    if( doclist.n>
24020 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61  0 && iRowid<=iLa
24030 73 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  stRowid ){.     
24040 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
24050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24060 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b  doclist.n; i++){
24070 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24080 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20  t( i<nBuf );.   
24090 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b         if( aBuf[
240a0 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i].n==0 ){.     
240b0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
240c0 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20  rSwap(&doclist, 
240d0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
240e0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
240f0 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b  rZero(&doclist);
24100 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
24110 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 4d  {.            xM
24120 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74  erge(p, &doclist
24130 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
24140 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
24150 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
24160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24180 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
24190 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
241a0 69 66 28 20 21 78 41 70 70 65 6e 64 28 70 2c 20  if( !xAppend(p, 
241b0 69 52 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77 69  iRowid-iLastRowi
241c0 64 2c 20 70 31 2c 20 70 43 6f 6c 73 65 74 2c 20  d, p1, pColset, 
241d0 26 64 6f 63 6c 69 73 74 29 20 29 7b 0a 20 20 20  &doclist) ){.   
241e0 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20       iLastRowid 
241f0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  = iRowid;.      
24200 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
24210 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b  (i=0; i<nBuf; i+
24220 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
24230 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
24240 7b 0a 20 20 20 20 20 20 20 20 78 4d 65 72 67 65  {.        xMerge
24250 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  (p, &doclist, &a
24260 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  Buf[i]);.      }
24270 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
24280 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b  rFree(&aBuf[i]);
24290 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
242a0 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
242b0 70 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61 20  p1);..    pData 
242c0 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
242d0 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61  p, sizeof(Fts5Da
242e0 74 61 29 20 2b 20 64 6f 63 6c 69 73 74 2e 6e 29  ta) + doclist.n)
242f0 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20  ;.    if( pData 
24300 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e  ){.      pData->
24310 70 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61 5b  p = (u8*)&pData[
24320 31 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2d  1];.      pData-
24330 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c  >nn = pData->szL
24340 65 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b  eaf = doclist.n;
24350 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44  .      memcpy(pD
24360 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e  ata->p, doclist.
24370 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20  p, doclist.n);. 
24380 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
24390 65 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61 2c  erNew2(p, pData,
243a0 20 62 44 65 73 63 2c 20 70 70 49 74 65 72 29 3b   bDesc, ppIter);
243b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
243c0 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69  ufferFree(&docli
243d0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  st);.  }..  fts5
243e0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
243f0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c  (pStruct);.  sql
24400 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b  ite3_free(aBuf);
24410 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  .}.../*.** Indic
24420 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ate that all sub
24430 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
24440 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
24450 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e  xWrite() pertain
24460 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d  .** to the docum
24470 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69  ent with rowid i
24480 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Rowid..*/.int sq
24490 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65  lite3Fts5IndexBe
244a0 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64  ginWrite(Fts5Ind
244b0 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 6c 65  ex *p, int bDele
244c0 74 65 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  te, i64 iRowid){
244d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
244e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
244f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
24500 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 66 20  e hash table if 
24510 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
24520 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
24530 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48  d */.  if( p->pH
24540 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ash==0 ){.    p-
24550 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
24560 35 48 61 73 68 4e 65 77 28 70 2d 3e 70 43 6f 6e  5HashNew(p->pCon
24570 66 69 67 2c 20 26 70 2d 3e 70 48 61 73 68 2c 20  fig, &p->pHash, 
24580 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  &p->nPendingData
24590 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75  );.  }..  /* Flu
245a0 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  sh the hash tabl
245b0 65 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65 71  e to disk if req
245c0 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 69  uired */.  if( i
245d0 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74 65 52  Rowid<p->iWriteR
245e0 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28 69 52 6f  owid .   || (iRo
245f0 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65 52 6f  wid==p->iWriteRo
24600 77 69 64 20 26 26 20 70 2d 3e 62 44 65 6c 65 74  wid && p->bDelet
24610 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 2d 3e  e==0).   || (p->
24620 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70  nPendingData > p
24630 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68  ->pConfig->nHash
24640 53 69 7a 65 29 20 0a 20 20 29 7b 0a 20 20 20 20  Size) .  ){.    
24650 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70  fts5IndexFlush(p
24660 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 57 72  );.  }..  p->iWr
24670 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  iteRowid = iRowi
24680 64 3b 0a 20 20 70 2d 3e 62 44 65 6c 65 74 65 20  d;.  p->bDelete 
24690 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74  = bDelete;.  ret
246a0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
246b0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
246c0 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20   Commit data to 
246d0 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
246e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e  ite3Fts5IndexSyn
246f0 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  c(Fts5Index *p, 
24700 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
24710 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
24720 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
24730 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
24740 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29  .  if( bCommit )
24750 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
24760 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  (p);.  return ft
24770 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
24780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
24790 72 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  rd any data stor
247a0 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
247b0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e  ory hash tables.
247c0 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74   Do not write it
247d0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
247e0 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
247f0 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
24800 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
24810 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62  he %_data.** tab
24820 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  le may have chan
24830 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ged on disk. So 
24840 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  any in-memory ca
24850 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a  ches of %_data .
24860 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20  ** records must 
24870 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
24880 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
24890 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28  s5IndexRollback(
248a0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
248b0 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
248c0 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  (p);.  fts5Index
248d0 44 69 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a  DiscardData(p);.
248e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
248f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
24900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25  ;.}../*.** The %
24920 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63  _data table is c
24930 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
24940 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24950 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  on is called. Th
24960 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  is.** function p
24970 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68  opulates it with
24980 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72   the initial str
24990 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66  ucture objects f
249a0 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a  or each index,.*
249b0 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61  * and the initia
249c0 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  l version of the
249d0 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
249e0 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20  rd (a zero-byte 
249f0 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  blob)..*/.int sq
24a00 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
24a10 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a  init(Fts5Index *
24a20 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
24a30 75 72 65 20 73 3b 0a 20 20 6d 65 6d 73 65 74 28  ure s;.  memset(
24a40 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
24a50 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20  s5Structure));. 
24a60 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
24a70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
24a80 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20 75 38  ROWID, (const u8
24a90 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74 73 35  *)"", 0);.  fts5
24aa0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
24ab0 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &s);.  return 
24ac0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
24ad0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  p);.}../*.** Ope
24ae0 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65  n a new Fts5Inde
24af0 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65  x handle. If the
24b00 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e   bCreate argumen
24b10 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61 74  t is true, creat
24b20 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
24b30 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
24b40 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  ng %_data table.
24b50 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
24b60 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f  sful, set *pp to
24b70 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
24b80 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  w object and ret
24b90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
24ba0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
24bb0 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   *pp to NULL and
24bc0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
24bd0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
24be0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24bf0 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73  IndexOpen(.  Fts
24c00 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
24c10 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65  , .  int bCreate
24c20 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  , .  Fts5Index *
24c30 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *pp,.  char **pz
24c40 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
24c50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
24c60 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  ts5Index *p;    
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24c80 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
24c90 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74  .  *pp = p = (Ft
24ca0 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33  s5Index*)sqlite3
24cb0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
24cc0 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49  rc, sizeof(Fts5I
24cd0 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63  ndex));.  if( rc
24ce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24cf0 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20     p->pConfig = 
24d00 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e  pConfig;.    p->
24d10 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35  nWorkUnit = FTS5
24d20 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
24d30 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71  p->zDataTbl = sq
24d40 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66  lite3Fts5Mprintf
24d50 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c  (&rc, "%s_data",
24d60 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29   pConfig->zName)
24d70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61  ;.    if( p->zDa
24d80 74 61 54 62 6c 20 26 26 20 62 43 72 65 61 74 65  taTbl && bCreate
24d90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
24da0 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
24db0 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20  Table(.         
24dc0 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22   pConfig, "data"
24dd0 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52  , "id INTEGER PR
24de0 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b  IMARY KEY, block
24df0 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72   BLOB", 0, pzErr
24e00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
24e10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24e20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
24e30 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  = sqlite3Fts5Cre
24e40 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67  ateTable(pConfig
24e50 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20  , "idx", .      
24e60 20 20 20 20 20 20 22 73 65 67 69 64 2c 20 74 65        "segid, te
24e70 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52  rm, pgno, PRIMAR
24e80 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72  Y KEY(segid, ter
24e90 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  m)", .          
24ea0 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20    1, pzErr.     
24eb0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
24ec0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24ee0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
24ef0 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b  5IndexReinit(p);
24f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24f10 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
24f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
24f30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
24f40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24f50 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e     sqlite3Fts5In
24f60 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20  dexClose(p);.   
24f70 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
24f80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24f90 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
24fa0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
24fb0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
24fc0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
24fd0 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
24fe0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
24ff0 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
25000 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
25010 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
25020 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
25030 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
25040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
25050 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65  nalize(p->pWrite
25060 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
25070 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c  finalize(p->pDel
25080 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  eter);.    sqlit
25090 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
250a0 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20  IdxWriter);.    
250b0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
250c0 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29  (p->pIdxDeleter)
250d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
250e0 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65  nalize(p->pIdxSe
250f0 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
25100 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70  e3Fts5HashFree(p
25110 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71  ->pHash);.    sq
25120 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44  lite3_free(p->zD
25130 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c  ataTbl);.    sql
25140 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
25150 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25160 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
25170 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
25180 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
25190 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74   utf-8 text that
251a0 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a   is n bytes in .
251b0 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  ** size. Return 
251c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
251d0 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72  tes in the nChar
251e0 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69   character prefi
251f0 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66  x of the.** buff
25200 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72  er, or 0 if ther
25210 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  e are less than 
25220 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73  nChar characters
25230 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74   in total..*/.st
25240 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
25250 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  Fts5IndexCharlen
25260 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e  ToBytelen(.  con
25270 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20 69  st char *p, .  i
25280 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74  nt nByte, .  int
25290 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20   nChar.){.  int 
252a0 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  n = 0;.  int i;.
252b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
252c0 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ar; i++){.    if
252d0 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74  ( n>=nByte ) ret
252e0 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49  urn 0;      /* I
252f0 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65  nput contains fe
25300 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63  wer than nChar c
25310 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  hars */.    if( 
25320 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
25330 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [n++]>=0xc0 ){. 
25340 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e       while( (p[n
25350 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
25360 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) n++;.    }.  }
25370 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
25380 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55  /*.** pIn is a U
25390 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
253a0 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69  ing, nIn bytes i
253b0 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  n size. Return t
253c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
253d0 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
253e0 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  rs in the string
253f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25400 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
25410 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e  (const char *pIn
25420 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e  , int nIn){.  in
25430 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20  t nChar = 0;    
25440 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
25450 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
25460 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  <nIn ){.    if( 
25470 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
25480 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b  In[i++]>=0xc0 ){
25490 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
254a0 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26  nIn && (pIn[i] &
254b0 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69   0xc0)==0x80 ) i
254c0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  ++;.    }.    nC
254d0 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  har++;.  }.  ret
254e0 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a  urn nChar;.}../*
254f0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
25500 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
25510 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
25520 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
25530 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
25540 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
25550 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
25560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25570 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
25580 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
25590 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
255a0 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
255b0 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
255c0 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
255d0 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
255e0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
255f0 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
25600 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
25610 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
25620 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
25630 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
25640 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
25650 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
25660 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
25670 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
25680 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
25690 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
256a0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
256b0 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
256c0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
256d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
256e0 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
256f0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
25720 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
25730 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
25740 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
25770 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
25780 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
25790 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
257a0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
257b0 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
257c0 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
257d0 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
257e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
25810 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
25820 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
25830 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
25840 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25850 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
25860 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
25870 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20  = p->pConfig;.. 
25880 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
25890 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
258a0 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d  ssert( (iCol<0)=
258b0 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a  =p->bDelete );..
258c0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74    /* Add the ent
258d0 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74  ry to the main t
258e0 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  erms index. */. 
258f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
25900 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20  5HashWrite(.    
25910 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69    p->pHash, p->i
25920 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
25930 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49  , iPos, FTS5_MAI
25940 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e  N_PREFIX, pToken
25950 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20  , nToken.  );.. 
25960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
25970 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20  fig->nPrefix && 
25980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
25990 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
259a0 6e 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e 66  nt nChar = pConf
259b0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b 0a  ig->aPrefix[i];.
259c0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
259d0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
259e0 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
259f0 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  (pToken, nToken,
25a00 20 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66 28   nChar);.    if(
25a10 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
25a20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
25a30 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48 61  HashWrite(p->pHa
25a40 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  sh, .          p
25a50 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69  ->iWriteRowid, i
25a60 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61 72  Col, iPos, (char
25a70 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  )(FTS5_MAIN_PREF
25a80 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c  IX+i+1), pToken,
25a90 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65  .          nByte
25aa0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
25ab0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
25ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
25ad0 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74  a new iterator t
25ae0 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68  o iterate though
25af0 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74 20   all rowid that 
25b00 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70  match the .** sp
25b10 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72  ecified token or
25b20 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a   token prefix..*
25b30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
25b40 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46  5IndexQuery(.  F
25b50 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b70 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71  * FTS index to q
25b80 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uery */.  const 
25b90 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
25ba0 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b  t nToken, /* Tok
25bb0 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74  en (or prefix) t
25bc0 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
25bd0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bf0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
25c00 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c  INDEX_QUERY_X fl
25c10 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  ags */.  Fts5Col
25c20 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
25c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
25c40 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  h these columns 
25c50 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e  only */.  Fts5In
25c60 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72  dexIter **ppIter
25c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25c80 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f  : New iterator o
25c90 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74  bject */.){.  Ft
25ca0 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
25cb0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
25cc0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
25cd0 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74  *pRet = 0;.  int
25ce0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46 74 73   iIdx = 0;.  Fts
25cf0 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30  5Buffer buf = {0
25d00 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49  , 0, 0};..  /* I
25d10 66 20 74 68 65 20 51 55 45 52 59 5f 53 43 41 4e  f the QUERY_SCAN
25d20 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6c   flag is set, al
25d30 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20 6d 75  l other flags mu
25d40 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f 0a  st be clear. */.
25d50 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
25d60 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
25d70 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c 20 66  RY_SCAN)==0 || f
25d80 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44 45 58 5f  lags==FTS5INDEX_
25d90 51 55 45 52 59 5f 53 43 41 4e 20 29 3b 0a 0a 20  QUERY_SCAN );.. 
25da0 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
25db0 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
25dc0 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b  c, &buf, nToken+
25dd0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  1)==0 ){.    mem
25de0 63 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70  cpy(&buf.p[1], p
25df0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
25e00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25e10 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 74  EBUG.    /* If t
25e20 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  he QUERY_TEST_NO
25e30 49 44 58 20 66 6c 61 67 20 77 61 73 20 73 70 65  IDX flag was spe
25e40 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69  cified, then thi
25e50 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20  s must be a.    
25e60 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e  ** prefix-query.
25e70 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e   Instead of usin
25e80 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78  g a prefix-index
25e90 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29   (if one exists)
25ea0 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61  , .    ** evalua
25eb0 74 65 20 74 68 65 20 70 72 65 66 69 78 20 71 75  te the prefix qu
25ec0 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61  ery using the ma
25ed0 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68  in FTS index. Th
25ee0 69 73 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  is is used.    *
25ef0 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73  * for internal s
25f00 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62  anity checking b
25f10 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  y the integrity-
25f20 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a  check in debug .
25f30 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79      ** mode only
25f40 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
25f50 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e  onfig->bPrefixIn
25f60 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  dex==0 || (flags
25f70 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
25f80 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29  RY_TEST_NOIDX) )
25f90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25fa0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
25fb0 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29  X_QUERY_PREFIX )
25fc0 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31  ;.      iIdx = 1
25fd0 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  +pConfig->nPrefi
25fe0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  x;.    }else.#en
25ff0 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67  dif.    if( flag
26000 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
26010 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  ERY_PREFIX ){.  
26020 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20      int nChar = 
26030 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
26040 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  (pToken, nToken)
26050 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78  ;.      for(iIdx
26060 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  =1; iIdx<=pConfi
26070 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
26080 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
26090 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
260a0 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72  x[iIdx-1]==nChar
260b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
260c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
260d0 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
260e0 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20  nPrefix ){.     
260f0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
26100 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
26110 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
26120 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
26130 20 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f   (u8)(FTS5_MAIN_
26140 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a  PREFIX + iIdx);.
26150 20 20 20 20 20 20 69 66 28 20 70 53 74 72 75 63        if( pStruc
26160 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  t ){.        fts
26170 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
26180 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61   pStruct, 1, fla
26190 67 73 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65  gs, buf.p, nToke
261a0 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65  n+1, -1, 0, &pRe
261b0 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
261c0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
261d0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20  (pStruct);.     
261e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
261f0 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20      int bDesc = 
26200 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
26210 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d  EX_QUERY_DESC)!=
26220 30 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  0;.      buf.p[0
26230 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
26240 45 46 49 58 3b 0a 20 20 20 20 20 20 66 74 73 35  EFIX;.      fts5
26250 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
26260 70 2c 20 62 44 65 73 63 2c 20 62 75 66 2e 70 2c  p, bDesc, buf.p,
26270 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73   nToken+1, pCols
26280 65 74 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20  et, &pRet);.    
26290 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
262a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
262b0 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
262c0 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74  Ret);.      pRet
262d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35   = 0;.      fts5
262e0 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
262f0 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 49 74 65      }.    *ppIte
26300 72 20 3d 20 70 52 65 74 3b 0a 20 20 20 20 73 71  r = pRet;.    sq
26310 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
26320 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20  ree(&buf);.  }. 
26330 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
26340 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
26350 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
26360 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
26370 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
26380 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nly argument is 
26390 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73  at EOF..*/.int s
263a0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
263b0 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  f(Fts5IndexIter 
263c0 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
263d0 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
263e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
263f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  );.  return pIte
26400 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->bEof;.}../*.*
26410 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
26420 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  xt matching rowi
26430 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  d. .*/.int sqlit
26440 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46  e3Fts5IterNext(F
26450 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
26460 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
26470 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
26480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
26490 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
264a0 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ext(pIter->pInde
264b0 78 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b  x, pIter, 0, 0);
264c0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
264d0 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d  dexReturn(pIter-
264e0 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  >pIndex);.}../*.
264f0 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
26500 65 78 74 20 6d 61 74 63 68 69 6e 67 20 74 65 72  ext matching ter
26510 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64 20 62 79  m/rowid. Used by
26520 20 74 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d   the fts5vocab m
26530 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  odule..*/.int sq
26540 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
26550 74 53 63 61 6e 28 46 74 73 35 49 6e 64 65 78 49  tScan(Fts5IndexI
26560 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
26570 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49  ts5Index *p = pI
26580 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20  ter->pIndex;..  
26590 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
265a0 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
265b0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d  E_OK );..  fts5M
265c0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
265d0 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pIter, 0, 0);.  
265e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
265f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
26600 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
26610 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
26620 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
26630 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 66 28  First ];.    if(
26640 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20   pSeg->pLeaf && 
26650 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21  pSeg->term.p[0]!
26660 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  =FTS5_MAIN_PREFI
26670 58 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  X ){.      fts5D
26680 61 74 61 52 65 6c 65 61 73 65 28 70 53 65 67 2d  ataRelease(pSeg-
26690 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70  >pLeaf);.      p
266a0 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  Seg->pLeaf = 0;.
266b0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f        pIter->bEo
266c0 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  f = 1;.    }.  }
266d0 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ..  return fts5I
266e0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
266f0 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
26700 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
26710 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
26720 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20  wid that occurs 
26730 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74  at or after iMat
26740 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e  ch. The.** defin
26750 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20  ition of "at or 
26760 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f  after" depends o
26770 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  n whether this i
26780 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73  terator iterates
26790 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
267a0 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72   or descending r
267b0 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69  owid order..*/.i
267c0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
267d0 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49  erNextFrom(Fts5I
267e0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
267f0 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
26800 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
26810 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e  tFrom(pIter->pIn
26820 64 65 78 2c 20 70 49 74 65 72 2c 20 69 4d 61 74  dex, pIter, iMat
26830 63 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ch);.  return ft
26840 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
26850 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
26860 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
26870 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e  e current rowid.
26880 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 46  .*/.i64 sqlite3F
26890 74 73 35 49 74 65 72 52 6f 77 69 64 28 46 74 73  ts5IterRowid(Fts
268a0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
268b0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  r){.  return fts
268c0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
268d0 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
268e0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
268f0 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e  ent term..*/.con
26900 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
26910 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73  Fts5IterTerm(Fts
26920 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
26930 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69  r, int *pn){.  i
26940 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
26950 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
26960 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74  har*)fts5MultiIt
26970 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
26980 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a  );.  *pn = n-1;.
26990 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a    return &z[1];.
269a0 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
269b0 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
269c0 6f 6c 73 65 74 20 28 0a 20 20 46 74 73 35 43 6f  olset (.  Fts5Co
269d0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
269e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
269f0 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e  set to filter on
26a00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
26a10 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20  pPos, int nPos, 
26a20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
26a30 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35  n list */.  Fts5
26a40 42 75 66 66 65 72 20 2a 70 42 75 66 20 20 20 20  Buffer *pBuf    
26a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26a60 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
26a70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26a80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
26a90 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  ;..  fts5BufferZ
26aa0 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 66 6f 72  ero(pBuf);.  for
26ab0 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
26ac0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
26ad0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 75 62 20   const u8 *pSub 
26ae0 3d 20 70 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20  = pPos;.    int 
26af0 6e 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78  nSub = fts5Index
26b00 45 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62  ExtractCol(&pSub
26b10 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d  , nPos, pColset-
26b20 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aiCol[i]);.    
26b30 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20 20  if( nSub ){.    
26b40 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
26b50 6e 64 42 6c 6f 62 28 26 72 63 2c 20 70 42 75 66  ndBlob(&rc, pBuf
26b60 2c 20 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a 20  , nSub, pSub);. 
26b70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
26b80 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
26b90 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
26ba0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
26bb0 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f  taining a copy o
26bc0 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
26bd0 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63  ist for.** the c
26be0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75  urrent entry. Ou
26bf0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
26c00 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
26c10 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
26c20 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20  er .** in bytes 
26c30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
26c40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
26c50 72 6e 65 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69  rned position li
26c60 73 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  st does not incl
26c70 75 64 65 20 74 68 65 20 22 6e 75 6d 62 65 72 20  ude the "number 
26c80 6f 66 20 62 79 74 65 73 22 20 76 61 72 69 6e 74  of bytes" varint
26c90 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 73  .** field that s
26ca0 74 61 72 74 73 20 74 68 65 20 70 6f 73 69 74 69  tarts the positi
26cb0 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e  on list on disk.
26cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
26cd0 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 0a  ts5IterPoslist(.
26ce0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
26cf0 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 43  *pIter, .  Fts5C
26d00 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
26d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
26d20 6c 75 6d 6e 20 66 69 6c 74 65 72 20 28 6f 72 20  lumn filter (or 
26d30 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  NULL) */.  const
26d40 20 75 38 20 2a 2a 70 70 2c 20 20 20 20 20 20 20   u8 **pp,       
26d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26d60 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f  T: Pointer to po
26d70 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61  sition-list data
26d80 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 2c 20 20   */.  int *pn,  
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
26db0 7a 65 20 6f 66 20 70 6f 73 69 74 69 6f 6e 2d 6c  ze of position-l
26dc0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
26dd0 20 20 69 36 34 20 2a 70 69 52 6f 77 69 64 20 20    i64 *piRowid  
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 2f 2a 20 4f 55 54 3a 20 43 75 72 72 65 6e    /* OUT: Curren
26e00 74 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  t rowid */.){.  
26e10 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
26e20 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
26e30 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
26e40 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 69  1].iFirst ];.  i
26e50 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 49 74  nt eDetail = pIt
26e60 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e  er->pIndex->pCon
26e70 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 0a 20  fig->eDetail;.. 
26e80 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
26e90 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
26ea0 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 69 52 6f  TE_OK );.  *piRo
26eb0 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
26ec0 69 64 3b 0a 20 20 69 66 28 20 65 44 65 74 61 69  id;.  if( eDetai
26ed0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
26ee0 4f 4e 45 20 29 7b 0a 20 20 20 20 2a 70 6e 20 3d  ONE ){.    *pn =
26ef0 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 7d   pSeg->nPos;.  }
26f00 65 6c 73 65 0a 20 20 69 66 28 20 65 44 65 74 61  else.  if( eDeta
26f10 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
26f20 46 55 4c 4c 20 0a 20 20 20 26 26 20 70 53 65 67  FULL .   && pSeg
26f30 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
26f40 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e  eg->nPos<=pSeg->
26f50 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20  pLeaf->szLeaf . 
26f60 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 50 6f 73   ){.    u8 *pPos
26f70 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
26f80 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
26f90 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70  fset];.    if( p
26fa0 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20 70 49 74  Colset==0 || pIt
26fb0 65 72 2d 3e 62 46 69 6c 74 65 72 65 64 20 29 7b  er->bFiltered ){
26fc0 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70 53 65  .      *pn = pSe
26fd0 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 20 20 2a  g->nPos;.      *
26fe0 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 7d  pp = pPos;.    }
26ff0 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 73 65 74  else if( pColset
27000 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20  ->nCol==1 ){.   
27010 20 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20     *pp = pPos;. 
27020 20 20 20 20 20 2a 70 6e 20 3d 20 66 74 73 35 49       *pn = fts5I
27030 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 70  ndexExtractCol(p
27040 70 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70  p, pSeg->nPos, p
27050 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d  Colset->aiCol[0]
27060 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27070 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
27080 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
27090 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49  st);.      fts5I
270a0 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65  ndexExtractColse
270b0 74 28 70 43 6f 6c 73 65 74 2c 20 70 50 6f 73 2c  t(pColset, pPos,
270c0 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 26 70 49   pSeg->nPos, &pI
270d0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
270e0 20 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72       *pp = pIter
270f0 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
27100 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e     *pn = pIter->
27110 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d  poslist.n;.    }
27120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
27130 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
27140 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
27150 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f     fts5SegiterPo
27160 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e  slist(pIter->pIn
27170 64 65 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73  dex, pSeg, pCols
27180 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  et, &pIter->posl
27190 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 65 44  ist);.    if( eD
271a0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
271b0 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
271c0 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pp = pIter->po
271d0 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 7d 0a 20  slist.p;.    }. 
271e0 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e     *pn = pIter->
271f0 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 20  poslist.n;.  }. 
27200 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27210 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
27220 49 6e 64 65 78 29 3b 0a 7d 0a 0a 69 6e 74 20 73  Index);.}..int s
27230 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6f  qlite3Fts5IterCo
27240 6c 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  llist(.  Fts5Ind
27250 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  exIter *pIter, .
27260 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c    const u8 **pp,
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27280 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
27290 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  r to position-li
272a0 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  st data */.  int
272b0 20 2a 70 6e 20 20 20 20 20 20 20 20 20 20 20 20   *pn            
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
272d0 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73  OUT: Size of pos
272e0 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79  ition-list in by
272f0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  tes */.){.  asse
27300 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
27310 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
27320 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
27330 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 2a 70  _COLUMNS );.  *p
27340 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  p = pIter->posli
27350 73 74 2e 70 3b 0a 20 20 2a 70 6e 20 3d 20 70 49  st.p;.  *pn = pI
27360 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ter->poslist.n;.
27370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27380 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
27390 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
273a0 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
273b0 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28  Fts5IterPoslist(
273c0 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
273d0 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 20  t.** copies the 
273e0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e  position list in
273f0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73 75  to the buffer su
27400 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
27410 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
27420 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
27430 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74  3Fts5IterPoslist
27440 42 75 66 66 65 72 28 46 74 73 35 49 6e 64 65 78  Buffer(Fts5Index
27450 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
27460 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
27470 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
27480 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
27490 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
274a0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
274b0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
274c0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
274d0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
274e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
274f0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42  ts5BufferZero(pB
27500 75 66 29 3b 0a 20 20 66 74 73 35 53 65 67 69 74  uf);.  fts5Segit
27510 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 53 65  erPoslist(p, pSe
27520 67 2c 20 30 2c 20 70 42 75 66 29 3b 0a 20 20 72  g, 0, pBuf);.  r
27530 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
27540 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
27550 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72  ** Close an iter
27560 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61  ator opened by a
27570 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
27580 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
27590 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f  exQuery()..*/.vo
275a0 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  id sqlite3Fts5It
275b0 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  erClose(Fts5Inde
275c0 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
275d0 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
275e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e    Fts5Index *pIn
275f0 64 65 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e  dex = pIter->pIn
27600 64 65 78 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  dex;.    fts5Mul
27610 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72  tiIterFree(pIter
27620 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 29  ->pIndex, pIter)
27630 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52  ;.    fts5CloseR
27640 65 61 64 65 72 28 70 49 6e 64 65 78 29 3b 0a 20  eader(pIndex);. 
27650 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
27660 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65 20   and decode the 
27670 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
27680 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
27690 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ase. .**.** Para
276a0 6d 65 74 65 72 20 61 6e 53 69 7a 65 20 6d 75 73  meter anSize mus
276b0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  t point to an ar
276c0 72 61 79 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c  ray of size nCol
276d0 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a  , where nCol is.
276e0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
276f0 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f   user defined co
27700 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53  lumns in the FTS
27710 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73   table..*/.int s
27720 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47  qlite3Fts5IndexG
27730 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
27740 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e  ndex *p, i64 *pn
27750 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65  Row, i64 *anSize
27760 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  ){.  int nCol = 
27770 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  p->pConfig->nCol
27780 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  ;.  Fts5Data *pD
27790 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d  ata;..  *pnRow =
277a0 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53   0;.  memset(anS
277b0 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  ize, 0, sizeof(i
277c0 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70  64) * nCol);.  p
277d0 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
277e0 65 61 64 28 70 2c 20 46 54 53 35 5f 41 56 45 52  ead(p, FTS5_AVER
277f0 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69  AGES_ROWID);.  i
27800 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
27810 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e  _OK && pData->nn
27820 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
27830 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  0;.    int iCol;
27840 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
27850 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
27860 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f  p[i], (u64*)pnRo
27870 77 29 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  w);.    for(iCol
27880 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20  =0; i<pData->nn 
27890 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43  && iCol<nCol; iC
278a0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b  ol++){.      i +
278b0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
278c0 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75  &pData->p[i], (u
278d0 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c  64*)&anSize[iCol
278e0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
278f0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
27900 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
27910 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
27920 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
27930 65 70 6c 61 63 65 20 74 68 65 20 63 75 72 72 65  eplace the curre
27940 6e 74 20 22 61 76 65 72 61 67 65 73 22 20 72 65  nt "averages" re
27950 63 6f 72 64 20 77 69 74 68 20 74 68 65 20 63 6f  cord with the co
27960 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75  ntents of the bu
27970 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65  ffer .** supplie
27980 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
27990 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
279a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
279b0 78 53 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xSetAverages(Fts
279c0 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74  5Index *p, const
279d0 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
279e0 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72 74  nData){.  assert
279f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
27a00 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61  OK );.  fts5Data
27a10 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56  Write(p, FTS5_AV
27a20 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44  ERAGES_ROWID, pD
27a30 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72  ata, nData);.  r
27a40 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
27a50 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
27a60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
27a70 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c  tal number of bl
27a80 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  ocks this module
27a90 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20 74   has read from t
27aa0 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62  he %_data.** tab
27ab0 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  le since it was 
27ac0 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  created..*/.int 
27ad0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27ae0 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78 20  Reads(Fts5Index 
27af0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
27b00 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >nRead;.}../*.**
27b10 20 53 65 74 20 74 68 65 20 33 32 2d 62 69 74 20   Set the 32-bit 
27b20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74 6f  cookie value sto
27b30 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
27b40 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75 72   of all structur
27b50 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f  e .** records to
27b60 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
27b70 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
27b80 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
27b90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27ba0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
27bb0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
27bc0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
27bd0 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ror.** occurs..*
27be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27bf0 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28  5IndexSetCookie(
27c00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
27c10 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72  t iNew){.  int r
27c20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
27c50 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
27c60 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
27c70 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66  nfig;    /* Conf
27c80 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74  iguration object
27c90 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65   */.  u8 aCookie
27ca0 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [4];            
27cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
27cc0 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  nary representat
27cd0 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20  ion of iNew */. 
27ce0 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
27cf0 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Blob = 0;..  ass
27d00 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
27d10 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74  TE_OK );.  sqlit
27d20 65 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f  e3Fts5Put32(aCoo
27d30 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72  kie, iNew);..  r
27d40 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
27d50 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64  _open(pConfig->d
27d60 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c  b, pConfig->zDb,
27d70 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20   p->zDataTbl, . 
27d80 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54       "block", FT
27d90 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
27da0 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20  ID, 1, &pBlob.  
27db0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
27dd0 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
27de0 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c  (pBlob, aCookie,
27df0 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d   4, 0);.    rc =
27e00 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
27e10 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a  ose(pBlob);.  }.
27e20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27e30 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
27e40 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28  IndexLoadConfig(
27e50 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
27e60 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
27e70 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75  pStruct;.  pStru
27e80 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
27e90 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73  reRead(p);.  fts
27ea0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
27eb0 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65  e(pStruct);.  re
27ec0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
27ed0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a  turn(p);.}.../**
27ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f20 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
27f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f70 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73  **.** Below this
27f80 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d   point is the im
27f90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
27fa0 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
27fb0 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  eck .** function
27fc0 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ality..*/../*.**
27fd0 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
27fe0 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
27ff0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
28000 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73  uments..*/.u64 s
28010 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
28020 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34  ntryCksum(.  i64
28030 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20   iRowid, .  int 
28040 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f  iCol, .  int iPo
28050 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a  s, .  int iIdx,.
28060 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
28070 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d  erm,.  int nTerm
28080 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  .){.  int i;.  u
28090 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64 3b  64 ret = iRowid;
280a0 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
280b0 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74  3) + iCol;.  ret
280c0 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
280d0 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64 78 3e  Pos;.  if( iIdx>
280e0 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72 65 74  =0 ) ret += (ret
280f0 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d 41 49  <<3) + (FTS5_MAI
28100 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29  N_PREFIX + iIdx)
28110 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
28120 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b  Term; i++) ret +
28130 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65  = (ret<<3) + pTe
28140 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20  rm[i];.  return 
28150 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ret;.}..#ifdef S
28160 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
28170 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28180 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74  is purely an int
28190 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64  ernal test. It d
281a0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
281b0 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75  te to .** FTS fu
281c0 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20  nctionality, or 
281d0 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69  even the integri
281e0 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79  ty-check, in any
281f0 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74   way..**.** Inst
28200 65 61 64 2c 20 69 74 20 74 65 73 74 73 20 74 68  ead, it tests th
28210 61 74 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  at the same set 
28220 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f  of pgno/rowid co
28230 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a  mbinations are .
28240 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67 61 72  ** visited regar
28250 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
28260 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
28270 65 78 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ex identified by
28280 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69   parameters.** i
28290 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69  Segid/iLeaf is i
282a0 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61  terated in forwa
282b0 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f  rds or reverse o
282c0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
282d0 76 6f 69 64 20 66 74 73 35 54 65 73 74 44 6c 69  void fts5TestDli
282e0 64 78 52 65 76 65 72 73 65 28 0a 20 20 46 74 73  dxReverse(.  Fts
282f0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e  5Index *p, .  in
28300 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  t iSegid,       
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28320 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c   Segment id to l
28330 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  oad from */.  in
28340 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20 20  t iLeaf         
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28360 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e   Load doclist-in
28370 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61  dex for this lea
28380 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  f */.){.  Fts5Dl
28390 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
283a0 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d  = 0;.  u64 cksum
283b0 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20 63 6b  1 = 13;.  u64 ck
283c0 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f  sum2 = 13;..  fo
283d0 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
283e0 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c  dxIterInit(p, 0,
283f0 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
28400 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
28410 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
28420 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
28430 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
28440 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
28450 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
28460 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
28470 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
28480 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
28490 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
284a0 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
284b0 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a  ( pgno>iLeaf );.
284c0 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52      cksum1 += iR
284d0 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e  owid + ((i64)pgn
284e0 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74  o<<32);.  }.  ft
284f0 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
28500 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64  pDlidx);.  pDlid
28510 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44  x = 0;..  for(pD
28520 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
28530 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 53 65  erInit(p, 1, iSe
28540 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  gid, iLeaf);.   
28550 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
28560 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
28570 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
28580 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70 44  dxIterPrev(p, pD
28590 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69  lidx).  ){.    i
285a0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
285b0 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
285c0 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20  Dlidx);.    int 
285d0 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  pgno = fts5Dlidx
285e0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
285f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ;.    assert( ft
28600 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
28610 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20 29 3b  pDlidx)>iLeaf );
28620 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69  .    cksum2 += i
28630 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67  Rowid + ((i64)pg
28640 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66  no<<32);.  }.  f
28650 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
28660 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69  (pDlidx);.  pDli
28670 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  dx = 0;..  if( p
28680 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
28690 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d  && cksum1!=cksum
286a0 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  2 ) p->rc = FTS5
286b0 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61  _CORRUPT;.}..sta
286c0 74 69 63 20 69 6e 74 20 66 74 73 35 51 75 65 72  tic int fts5Quer
286d0 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 49 6e  yCksum(.  Fts5In
286e0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
286f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
28700 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  5 index object *
28710 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20  /.  int iIdx,.  
28720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20  const char *z,  
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74 6f 20  /* Index key to 
28750 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
28760 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28780 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65 78 20  * Size of index 
28790 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  key in bytes */.
287a0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 46    /* Flags for F
287d0 74 73 35 49 6e 64 65 78 51 75 65 72 79 20 2a 2f  ts5IndexQuery */
287e0 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 20 20  .  u64 *pCksum  
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68     /* IN/OUT: Ch
28810 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a  ecksum value */.
28820 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  ){.  int eDetail
28830 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
28840 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b  Detail;.  u64 ck
28850 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  sum = *pCksum;. 
28860 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
28870 70 49 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20  pIdxIter = 0;.  
28880 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
28890 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 69 6e   {0, 0, 0};.  in
288a0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
288b0 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20  s5IndexQuery(p, 
288c0 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c 20  z, n, flags, 0, 
288d0 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 77  &pIdxIter);..  w
288e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
288f0 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
28900 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 64  3Fts5IterEof(pId
28910 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36  xIter) ){.    i6
28920 34 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  4 rowid = sqlite
28930 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 70  3Fts5IterRowid(p
28940 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 20 20 69  IdxIter);..    i
28950 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
28960 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
28970 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73        cksum ^= s
28980 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
28990 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c  ntryCksum(rowid,
289a0 20 30 2c 20 30 2c 20 69 49 64 78 2c 20 7a 2c 20   0, 0, iIdx, z, 
289b0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
289c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
289d0 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74  3Fts5IterPoslist
289e0 42 75 66 66 65 72 28 70 49 64 78 49 74 65 72 2c  Buffer(pIdxIter,
289f0 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 69 66   &buf);.      if
28a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28a10 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  ){.        Fts5P
28a20 6f 73 6c 69 73 74 52 65 61 64 65 72 20 73 52 65  oslistReader sRe
28a30 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 66 6f  ader;.        fo
28a40 72 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  r(sqlite3Fts5Pos
28a50 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 62  listReaderInit(b
28a60 75 66 2e 70 2c 20 62 75 66 2e 6e 2c 20 26 73 52  uf.p, buf.n, &sR
28a70 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20  eader);.        
28a80 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66      sReader.bEof
28a90 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ==0;.           
28aa0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
28ab0 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 73  istReaderNext(&s
28ac0 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 20 20  Reader).        
28ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
28ae0 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53   iCol = FTS5_POS
28af0 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e  2COLUMN(sReader.
28b00 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  iPos);.         
28b10 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35   int iOff = FTS5
28b20 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61  _POS2OFFSET(sRea
28b30 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
28b40 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71       cksum ^= sq
28b50 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
28b60 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20  tryCksum(rowid, 
28b70 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78  iCol, iOff, iIdx
28b80 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , z, n);.       
28b90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28ba0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28bb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
28bd0 49 74 65 72 4e 65 78 74 28 70 49 64 78 49 74 65  IterNext(pIdxIte
28be0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
28bf0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
28c00 6c 6f 73 65 28 70 49 64 78 49 74 65 72 29 3b 0a  lose(pIdxIter);.
28c10 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
28c20 28 26 62 75 66 29 3b 0a 0a 20 20 2a 70 43 6b 73  (&buf);..  *pCks
28c30 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65  um = cksum;.  re
28c40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
28c50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
28c60 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20   is also purely 
28c70 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
28c80 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
28c90 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
28ca0 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
28cb0 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
28cc0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
28cd0 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73  in any way..*/.s
28ce0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
28cf0 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49  estTerm(.  Fts5I
28d00 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
28d10 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20  Buffer *pPrev,  
28d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28d30 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a  revious term */.
28d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
28d50 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
28d60 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65    /* Possibly ne
28d70 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a  w term to test *
28d80 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65 64  /.  u64 expected
28d90 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a  ,.  u64 *pCksum.
28da0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
28db0 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76  >rc;.  if( pPrev
28dc0 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
28dd0 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
28de0 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
28df0 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73  t u8*)z);.  }els
28e00 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  e.  if( rc==SQLI
28e10 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d  TE_OK && (pPrev-
28e20 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  >n!=n || memcmp(
28e30 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29  pPrev->p, z, n))
28e40 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75   ){.    u64 cksu
28e50 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20  m3 = *pCksum;.  
28e60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
28e70 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  erm = (const cha
28e80 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b  r*)&pPrev->p[1];
28e90 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70    /* term sans p
28ea0 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20  refix-byte */.  
28eb0 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50    int nTerm = pP
28ec0 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20  rev->n-1;       
28ed0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
28ee0 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
28ef0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d  /.    int iIdx =
28f00 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20   (pPrev->p[0] - 
28f10 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
28f20 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  );.    int flags
28f30 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20   = (iIdx==0 ? 0 
28f40 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  : FTS5INDEX_QUER
28f50 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75  Y_PREFIX);.    u
28f60 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20  64 ck1 = 0;.    
28f70 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20  u64 ck2 = 0;..  
28f80 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
28f90 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
28fa0 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64  rned for ASC and
28fb0 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72   DESC queries ar
28fc0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
28fd0 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20  e. If not, call 
28fe0 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  this corruption.
28ff0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74    */.    rc = ft
29000 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
29010 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
29020 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29  rm, flags, &ck1)
29030 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
29040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29050 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
29060 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
29070 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ESC;.      rc = 
29080 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
29090 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
290a0 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
290b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
290c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
290d0 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
290e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
290f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
29100 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20  a prefix query, 
29110 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  check that the r
29120 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
29130 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  if the.    ** th
29140 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61 62  e index is disab
29150 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d 65  led are the same
29160 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e  . In both ASC an
29170 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20  d DESC order. . 
29180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
29190 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79  s check may only
291a0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
291b0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
291c0 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20  is empty. This. 
291d0 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65     ** is because
291e0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
291f0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20  only supports a 
29200 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72  single scan quer
29210 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69  y at.    ** a ti
29220 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74  me, and the mult
29230 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d  i-iter loop from
29240 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e 63   which this func
29250 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20  tion is called. 
29260 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
29270 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68   performing such
29280 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20   a scan. */.    
29290 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
292a0 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
292b0 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63  if( iIdx>0 && rc
292c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
292d0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66         int f = f
292e0 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
292f0 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b  UERY_TEST_NOIDX;
29300 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30  .        ck2 = 0
29310 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
29320 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
29330 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
29340 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
29350 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29360 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
29370 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
29380 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
29390 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78  }.      if( iIdx
293a0 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >0 && rc==SQLITE
293b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
293c0 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
293d0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
293e0 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45  T_NOIDX|FTS5INDE
293f0 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
29400 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
29410 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
29420 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
29430 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
29440 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
29450 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29460 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
29470 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
29480 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
29490 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33     }..    cksum3
294a0 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73   ^= ck1;.    fts
294b0 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
294c0 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
294d0 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66   u8*)z);..    if
294e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
294f0 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63  && cksum3!=expec
29500 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ted ){.      rc 
29510 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
29520 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75      }.    *pCksu
29530 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a  m = cksum3;.  }.
29540 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a    p->rc = rc;.}.
29550 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65   .#else.# define
29560 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
29570 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64  verse(x,y,z).# d
29580 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54 65  efine fts5TestTe
29590 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  rm(u,v,w,x,y,z).
295a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
295b0 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  eck that:.**.** 
295c0 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20    1) All leaves 
295d0 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20  of pSeg between 
295e0 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74  iFirst and iLast
295f0 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69   (inclusive) exi
29600 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63  st and.**      c
29610 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d  ontain zero term
29620 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c  s..**   2) All l
29630 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65  eaves of pSeg be
29640 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61  tween iNoRowid a
29650 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73  nd iLast (inclus
29660 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a  ive) exist and.*
29670 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a  *      contain z
29680 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73  ero rowids..*/.s
29690 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
296a0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
296b0 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49  ckEmpty(.  Fts5I
296c0 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
296d0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
296e0 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65  *pSeg,     /* Se
296f0 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
29700 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
29710 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ncy */.  int iFi
29720 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f  rst,.  int iNoRo
29730 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74  wid,.  int iLast
29740 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
29750 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
29760 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
29770 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
29780 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
29790 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69  eaf.  ** (a) exi
297a0 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
297b0 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
297c0 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
297d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
297e0 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b   && i<=iLast; i+
297f0 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61  +){.    Fts5Data
29800 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61   *pLeaf = fts5Da
29810 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
29820 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
29830 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a  g->iSegid, i));.
29840 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
29850 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73 35  .      if( !fts5
29860 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
29870 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20  Leaf) ) p->rc = 
29880 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
29890 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f      if( i>=iNoRo
298a0 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65  wid && 0!=fts5Le
298b0 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
298c0 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
298d0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
298e0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
298f0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
29900 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
29910 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72 69 74  oid fts5Integrit
29920 79 43 68 65 63 6b 50 67 69 64 78 28 46 74 73 35  yCheckPgidx(Fts5
29930 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61  Index *p, Fts5Da
29940 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e  ta *pLeaf){.  in
29950 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a  t iTermOff = 0;.
29960 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73    int ii;..  Fts
29970 35 42 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b  5Buffer buf1 = {
29980 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75  0,0,0};.  Fts5Bu
29990 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30  ffer buf2 = {0,0
299a0 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65  ,0};..  ii = pLe
299b0 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68  af->szLeaf;.  wh
299c0 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e  ile( ii<pLeaf->n
299d0 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  n && p->rc==SQLI
299e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
299f0 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f   res;.    int iO
29a00 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63  ff;.    int nInc
29a10 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74  r;..    ii += ft
29a20 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
29a30 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e  Leaf->p[ii], nIn
29a40 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  cr);.    iTermOf
29a50 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20  f += nIncr;.    
29a60 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
29a70 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ..    if( iOff>=
29a80 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
29a90 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
29aa0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
29ab0 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
29ac0 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20  Off==nIncr ){.  
29ad0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
29ae0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
29af0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
29b00 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42  eaf->p[iOff], nB
29b10 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
29b20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65  (iOff+nByte)>pLe
29b30 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
29b40 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
29b50 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
29b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29b70 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
29b80 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42  p->rc, &buf1, nB
29b90 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69  yte, &pLeaf->p[i
29ba0 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Off]);.      }. 
29bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29bc0 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65  int nKeep, nByte
29bd0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
29be0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
29bf0 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
29c00 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69   nKeep);.      i
29c10 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
29c20 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
29c30 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
29c40 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e        if( nKeep>
29c50 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b  buf1.n || (iOff+
29c60 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a  nByte)>pLeaf->sz
29c70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
29c80 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
29c90 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
29ca0 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e  e{.        buf1.
29cb0 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20  n = nKeep;.     
29cc0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
29cd0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
29ce0 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70  &buf1, nByte, &p
29cf0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Leaf->p[iOff]);.
29d00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
29d10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
29d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29d30 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
29d40 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26 62  ompare(&buf1, &b
29d50 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  uf2);.        if
29d60 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63  ( res<=0 ) p->rc
29d70 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
29d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29d90 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
29da0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20  (&p->rc, &buf2, 
29db0 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b  buf1.n, buf1.p);
29dc0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66  .  }..  fts5Buff
29dd0 65 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20  erFree(&buf1);. 
29de0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
29df0 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  &buf2);.}..stati
29e00 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
29e10 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
29e20 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  gment(.  Fts5Ind
29e30 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
29e40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
29e50 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
29e60 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
29e70 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
29e80 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
29e90 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61  to check interna
29ea0 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f  l consistency */
29eb0 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
29ec0 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
29ed0 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65  Config;.  sqlite
29ee0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
29ef0 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  0;.  int rc2;.  
29f00 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61 66  int iIdxPrevLeaf
29f10 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
29f20 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69  st-1;.  int iDli
29f30 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
29f40 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20  g->pgnoLast;..  
29f50 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
29f60 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  rst==0 ) return;
29f70 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72 65  ..  fts5IndexPre
29f80 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74  pareStmt(p, &pSt
29f90 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  mt, sqlite3_mpri
29fa0 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45  ntf(.      "SELE
29fb0 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20  CT segid, term, 
29fc0 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f  (pgno>>1), (pgno
29fd0 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  &1) FROM %Q.'%q_
29fe0 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64  idx' WHERE segid
29ff0 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e  =%d",.      pCon
2a000 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
2a010 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e  g->zName, pSeg->
2a020 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20  iSegid.  ));..  
2a030 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
2a040 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  gh the b-tree hi
2a050 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77  erarchy.  */.  w
2a060 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
2a070 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
2a080 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2a090 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
2a0a0 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20   i64 iRow;      
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a0c0 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
2a0d0 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73   leaf */.    Fts
2a0e0 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
2a0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2a100 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ta for this leaf
2a110 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64   */..    int nId
2a120 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f  xTerm = sqlite3_
2a130 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
2a140 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 1);.    cons
2a150 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d  t char *zIdxTerm
2a160 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2a170 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2a180 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
2a190 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20     int iIdxLeaf 
2a1a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2a1b0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  _int(pStmt, 2);.
2a1c0 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64      int bIdxDlid
2a1d0 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
2a1e0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29  mn_int(pStmt, 3)
2a1f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2a200 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f   leaf in questio
2a210 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2a220 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20  en trimmed from 
2a230 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20  the segment, .  
2a240 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73    ** ignore this
2a250 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f   b-tree entry. O
2a260 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69  therwise, load i
2a270 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a  t into memory. *
2a280 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65  /.    if( iIdxLe
2a290 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  af<pSeg->pgnoFir
2a2a0 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
2a2b0 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53     iRow = FTS5_S
2a2c0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
2a2d0 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c  g->iSegid, iIdxL
2a2e0 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20  eaf);.    pLeaf 
2a2f0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2a300 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  , iRow);.    if(
2a310 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
2a320 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  k;..    /* Check
2a330 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63   that the leaf c
2a340 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
2a350 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74   one term, and t
2a360 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a  hat it is equal.
2a370 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72      ** to or lar
2a380 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c  ger than the spl
2a390 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65  it-key in zIdxTe
2a3a0 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20  rm.  Also check 
2a3b0 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20 20  that if there.  
2a3c0 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72    ** is also a r
2a3d0 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74  owid pointer wit
2a3e0 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67  hin the leaf pag
2a3f0 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69  e header, it poi
2a400 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20  nts to a.    ** 
2a410 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
2a420 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20  the term.  */.  
2a430 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c    if( pLeaf->nn<
2a440 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2a450 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
2a460 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2a470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2a480 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
2a490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2a4a0 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
2a4b0 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
2a4c0 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
2a4d0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2a4e0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
2a4f0 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
2a500 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   */.      int nT
2a510 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2a520 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2a530 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e   term on leaf in
2a540 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2a550 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
2a560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2a570 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72  omparison of ter
2a580 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20  m and split-key 
2a590 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  */..      iOff =
2a5a0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
2a5b0 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  rmOff(pLeaf);.  
2a5c0 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
2a5d0 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2a5e0 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  idOff(pLeaf);.  
2a5f0 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
2a600 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20  f>=iOff ){.     
2a610 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2a620 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2a630 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
2a640 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2a650 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2a660 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20  iOff], nTerm);. 
2a670 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d         res = mem
2a680 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  cmp(&pLeaf->p[iO
2a690 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d  ff], zIdxTerm, M
2a6a0 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65  IN(nTerm, nIdxTe
2a6b0 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
2a6c0 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
2a6d0 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72   nTerm - nIdxTer
2a6e0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  m;.        if( r
2a6f0 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  es<0 ) p->rc = F
2a700 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2a710 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
2a720 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67  IntegrityCheckPg
2a730 69 64 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20  idx(p, pLeaf);. 
2a740 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
2a750 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2a760 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
2a770 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
2a780 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2a790 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
2a7a0 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
2a7b0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
2a7c0 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73  .    ** (a) exis
2a7d0 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
2a7e0 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20  n no terms. */. 
2a7f0 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65     fts5IndexInte
2a800 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28  grityCheckEmpty(
2a810 0a 20 20 20 20 20 20 20 20 70 2c 20 70 53 65 67  .        p, pSeg
2a820 2c 20 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31  , iIdxPrevLeaf+1
2a830 2c 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66  , iDlidxPrevLeaf
2a840 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20  +1, iIdxLeaf-1. 
2a850 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d     );.    if( p-
2a860 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
2a870 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2a880 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
2a890 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  , check that it 
2a8a0 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a  looks right. */.
2a8b0 20 20 20 20 69 66 28 20 62 49 64 78 44 6c 69 64      if( bIdxDlid
2a8c0 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44  x ){.      Fts5D
2a8d0 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
2a8e0 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74   = 0;  /* For it
2a8f0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
2a900 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f  doclist index */
2a910 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 65 76  .      int iPrev
2a920 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b  Leaf = iIdxLeaf;
2a930 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 69  .      int iSegi
2a940 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64  d = pSeg->iSegid
2a950 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 20  ;.      int iPg 
2a960 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69  = 0;.      i64 i
2a970 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Key;..      for(
2a980 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
2a990 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69  IterInit(p, 0, i
2a9a0 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2a9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
2a9c0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
2a9d0 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
2a9e0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2a9f0 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
2aa00 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20  x).      ){..   
2aa10 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e       /* Check an
2aa20 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67  y rowid-less pag
2aa30 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
2aa40 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2aa50 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20   leaf. */.      
2aa60 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
2aa70 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44  eaf+1; iPg<fts5D
2aa80 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2aa90 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  idx); iPg++){.  
2aaa0 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
2aab0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2aac0 44 28 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a  D(iSegid, iPg);.
2aad0 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20            pLeaf 
2aae0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2aaf0 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , iKey);.       
2ab00 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ab20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2ab30 69 64 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20  idOff(pLeaf)!=0 
2ab40 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2ab50 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2ab60 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2ab70 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
2ab80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ab90 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c  }.        iPrevL
2aba0 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49  eaf = fts5DlidxI
2abb0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
2abc0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
2abd0 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
2abe0 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
2abf0 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
2ac00 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20  really does.    
2ac10 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74      ** contain t
2ac20 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74  he rowid suggest
2ac30 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20  ed by the same. 
2ac40 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  */.        iKey 
2ac50 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
2ac60 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 72  OWID(iSegid, iPr
2ac70 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  evLeaf);.       
2ac80 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
2ac90 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
2aca0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
2acb0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
2acc0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
2acd0 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
2ace0 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
2acf0 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2ad00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53  );.          ASS
2ad10 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
2ad20 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2ad30 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70  if( iRowidOff>=p
2ad40 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
2ad60 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ad70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2ad80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
2ad90 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
2ada0 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66  eaf->p[iRowidOff
2adb0 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
2adc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2add0 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44  f( iRowid!=fts5D
2ade0 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
2adf0 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20  lidx) ) p->rc = 
2ae00 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2ae10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ae20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2ae30 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
2ae40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
2ae50 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c       iDlidxPrevL
2ae60 65 61 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20  eaf = iPg;.     
2ae70 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2ae80 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  ee(pDlidx);.    
2ae90 20 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52    fts5TestDlidxR
2aea0 65 76 65 72 73 65 28 70 2c 20 69 53 65 67 69 64  everse(p, iSegid
2aeb0 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20  , iIdxLeaf);.   
2aec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44   }else{.      iD
2aed0 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  lidxPrevLeaf = p
2aee0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20  Seg->pgnoLast;. 
2aef0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
2af00 65 63 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20  eck there is no 
2af10 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f  doclist index */
2af20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78  .    }..    iIdx
2af30 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c  PrevLeaf = iIdxL
2af40 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20  eaf;.  }..  rc2 
2af50 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
2af60 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
2af70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2af80 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b  K ) p->rc = rc2;
2af90 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72  ..  /* Page iter
2afa0 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20  .iLeaf must now 
2afb0 62 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  be the rightmost
2afc0 20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68   leaf-page in th
2afd0 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66  e segment */.#if
2afe0 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   0.  if( p->rc==
2aff0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65  SQLITE_OK && ite
2b000 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70  r.iLeaf!=pSeg->p
2b010 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
2b020 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2b030 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  UPT;.  }.#endif.
2b040 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e  }.../*.** Run in
2b050 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f  ternal checks to
2b060 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
2b070 20 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69   FTS index (a) i
2b080 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a  s internally .**
2b090 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20   consistent and 
2b0a0 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  (b) contains ent
2b0b0 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74  ries for which t
2b0c0 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68  he XOR of the ch
2b0d0 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61  ecksums.** as ca
2b0e0 6c 63 75 6c 61 74 65 64 20 62 79 20 73 71 6c 69  lculated by sqli
2b0f0 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2b100 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75  yCksum() is cksu
2b110 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  m..**.** Return 
2b120 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
2b130 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74  f any of the int
2b140 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69  ernal checks fai
2b150 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  l, or if the.** 
2b160 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f  checksum does no
2b170 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20  t match. Return 
2b180 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
2b190 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74   checks pass wit
2b1a0 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f  hout.** error, o
2b1b0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c  r some other SQL
2b1c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2b1d0 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  f another error 
2b1e0 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63  (e.g. OOM).** oc
2b1f0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
2b200 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74  ite3Fts5IndexInt
2b210 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35  egrityCheck(Fts5
2b220 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b  Index *p, u64 ck
2b230 73 75 6d 29 7b 0a 20 20 69 6e 74 20 65 44 65 74  sum){.  int eDet
2b240 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
2b250 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34  ->eDetail;.  u64
2b260 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20   cksum2 = 0;    
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b280 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
2b290 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  n contents of in
2b2a0 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  dexes */.  Fts5B
2b2b0 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d 20  uffer poslist = 
2b2c0 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75  {0,0,0};   /* Bu
2b2d0 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c  ffer used to hol
2b2e0 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  d a poslist */. 
2b2f0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
2b300 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
2b310 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2b320 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74 69  ate through enti
2b330 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  re index */.  Ft
2b340 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
2b350 72 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  ruct;         /*
2b360 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
2b370 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2b380 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 73  TE_DEBUG.  /* Us
2b390 65 64 20 62 79 20 65 78 74 72 61 20 69 6e 74 65  ed by extra inte
2b3a0 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20  rnal tests only 
2b3b0 72 75 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73  run if NDEBUG is
2b3c0 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a   not defined */.
2b3d0 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30    u64 cksum3 = 0
2b3e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b3f0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2b400 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
2b410 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
2b420 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 20  Fts5Buffer term 
2b430 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
2b440 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
2b450 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65  o hold most rece
2b460 6e 74 20 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69  nt term */.#endi
2b470 66 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  f.  .  /* Load t
2b480 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74 72  he FTS index str
2b490 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72  ucture */.  pStr
2b4a0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
2b4b0 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f  ureRead(p);..  /
2b4c0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2b4d0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20   internal nodes 
2b4e0 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20  of each segment 
2b4f0 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76 65 73  match the leaves
2b500 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63   */.  if( pStruc
2b510 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  t ){.    int iLv
2b520 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72  l, iSeg;.    for
2b530 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
2b540 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
2b550 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  Lvl++){.      fo
2b560 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
2b570 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
2b580 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
2b590 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  +){.        Fts5
2b5a0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2b5b0 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75 63   *pSeg = &pStruc
2b5c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
2b5d0 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
2b5e0 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74      fts5IndexInt
2b5f0 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
2b600 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20  nt(p, pSeg);.   
2b610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2b620 20 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61    /* The cksum a
2b630 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
2b640 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
2b650 69 73 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61  is a checksum ca
2b660 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61  lculated.  ** ba
2b670 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63  sed on all expec
2b680 74 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74  ted entries in t
2b690 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e  he FTS index (in
2b6a0 63 6c 75 64 69 6e 67 20 70 72 65 66 69 78 20 69  cluding prefix i
2b6b0 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65  ndex.  ** entrie
2b6c0 73 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63  s). This block c
2b6d0 68 65 63 6b 73 20 74 68 61 74 20 61 20 63 68 65  hecks that a che
2b6e0 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64  cksum calculated
2b6f0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20   based on the.  
2b700 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e  ** actual conten
2b710 74 73 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20  ts of FTS index 
2b720 69 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20  is identical..  
2b730 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73  **.  ** Two vers
2b740 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65  ions of the same
2b750 20 63 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61   checksum are ca
2b760 6c 63 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69  lculated. The fi
2b770 72 73 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20  rst (stack.  ** 
2b780 76 61 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29  variable cksum2)
2b790 20 62 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65   based on entrie
2b7a0 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
2b7b0 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
2b7c0 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20  ndex.  ** while 
2b7d0 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73  doing a linear s
2b7e0 63 61 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69  can of each indi
2b7f0 76 69 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20  vidual index in 
2b800 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  turn. .  **.  **
2b810 20 41 73 20 65 61 63 68 20 74 65 72 6d 20 76 69   As each term vi
2b820 73 69 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e  sited by the lin
2b830 65 61 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70  ear scans, a sep
2b840 61 72 61 74 65 20 71 75 65 72 79 20 66 6f 72 20  arate query for 
2b850 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65  the.  ** same te
2b860 72 6d 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  rm is performed.
2b870 20 63 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75   cksum3 is calcu
2b880 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  lated based on t
2b890 68 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  he entries.  ** 
2b8a0 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
2b8b0 73 65 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  se queries..  */
2b8c0 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69  .  for(fts5Multi
2b8d0 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
2b8e0 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ct, 0, 0, 0, 0, 
2b8f0 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a  -1, 0, &pIter);.
2b900 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
2b910 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
2b920 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  ==0;.      fts5M
2b930 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
2b940 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29  pIter, 0, 0).  )
2b950 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  {.    int n;    
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b970 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
2b980 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
2b990 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20    i64 iPos = 0; 
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b9b0 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66   Position read f
2b9c0 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  rom poslist */. 
2b9d0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
2b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b9f0 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20  * Offset within 
2ba00 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  poslist */.    i
2ba10 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
2ba20 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
2ba30 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Iter);.    char 
2ba40 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35  *z = (char*)fts5
2ba50 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
2ba60 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f  ter, &n);..    /
2ba70 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e  * If this is a n
2ba80 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66  ew term, query f
2ba90 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b  or it. Update ck
2baa0 73 75 6d 33 20 77 69 74 68 20 74 68 65 20 72 65  sum3 with the re
2bab0 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74  sults. */.    ft
2bac0 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74  s5TestTerm(p, &t
2bad0 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d  erm, z, n, cksum
2bae0 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20  2, &cksum3);..  
2baf0 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
2bb00 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
2bb10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
2bb20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
2bb30 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29  mpty(p, pIter) )
2bb40 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32  {.        cksum2
2bb50 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2bb60 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
2bb70 52 6f 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31 2c  Rowid, 0, 0, -1,
2bb80 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
2bb90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bba0 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a   poslist.n = 0;.
2bbb0 20 20 20 20 20 20 66 74 73 35 53 65 67 69 74 65        fts5Segite
2bbc0 72 50 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74  rPoslist(p, &pIt
2bbd0 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
2bbe0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
2bbf0 5d 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b  ], 0, &poslist);
2bc00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 3d  .      while( 0=
2bc10 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c  =sqlite3Fts5Posl
2bc20 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73  istNext64(poslis
2bc30 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20  t.p, poslist.n, 
2bc40 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b  &iOff, &iPos) ){
2bc50 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
2bc60 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  l = FTS5_POS2COL
2bc70 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20  UMN(iPos);.     
2bc80 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d     int iTokOff =
2bc90 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
2bca0 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  (iPos);.        
2bcb0 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65  cksum2 ^= sqlite
2bcc0 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2bcd0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
2bce0 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20  l, iTokOff, -1, 
2bcf0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2bd00 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54     }.  }.  fts5T
2bd10 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d  estTerm(p, &term
2bd20 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20  , 0, 0, cksum2, 
2bd30 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73  &cksum3);..  fts
2bd40 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
2bd50 2c 20 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20  , pIter);.  if( 
2bd60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2bd70 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d   && cksum!=cksum
2bd80 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  2 ) p->rc = FTS5
2bd90 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73  _CORRUPT;..  fts
2bda0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
2bdb0 65 28 70 53 74 72 75 63 74 29 3b 0a 23 69 66 64  e(pStruct);.#ifd
2bdc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2bdd0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
2bde0 28 26 74 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a  (&term);.#endif.
2bdf0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
2be00 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65  (&poslist);.  re
2be10 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
2be20 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn(p);.}../***
2be30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be70 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2be80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2beb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bec0 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20  *.** Below this 
2bed0 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70  point is the imp
2bee0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
2bef0 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
2bf00 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74   scalar.** funct
2bf10 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a  ion only..*/../*
2bf20 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67  .** Decode a seg
2bf30 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20  ment-data rowid 
2bf40 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
2bf50 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
2bf60 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f  tion is.** the o
2bf70 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f  pposite of macro
2bf80 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2bf90 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  WID()..*/.static
2bfa0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2bfb0 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f  Rowid(.  i64 iRo
2bfc0 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
2bfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2bfe0 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61  d from %_data ta
2bff0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ble */.  int *pi
2c000 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
2c010 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2c020 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
2c030 20 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20 20   int *pbDlidx,  
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c050 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20 66   /* OUT: Dlidx f
2c060 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  lag */.  int *pi
2c070 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
2c080 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2c090 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74   Height */.  int
2c0a0 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20   *piPgno        
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c0c0 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72  OUT: Page number
2c0d0 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f   */.){.  *piPgno
2c0e0 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
2c0f0 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
2c100 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20  S5_DATA_PAGE_B) 
2c110 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
2c120 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41  >>= FTS5_DATA_PA
2c130 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67  GE_B;..  *piHeig
2c140 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  ht = (int)(iRowi
2c150 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
2c160 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2c170 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
2c180 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
2c190 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a  A_HEIGHT_B;..  *
2c1a0 70 62 44 6c 69 64 78 20 3d 20 28 69 6e 74 29 28  pbDlidx = (int)(
2c1b0 69 52 6f 77 69 64 20 26 20 30 78 30 30 30 31 29  iRowid & 0x0001)
2c1c0 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
2c1d0 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a  TS5_DATA_DLI_B;.
2c1e0 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69  .  *piSegid = (i
2c1f0 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
2c200 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
2c210 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a  TA_ID_B) - 1));.
2c220 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
2c230 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 69 6e  ts5DebugRowid(in
2c240 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
2c250 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b  er *pBuf, i64 iK
2c260 65 79 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  ey){.  int iSegi
2c270 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
2c280 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20  o, bDlidx;      
2c290 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e   /* Rowid compen
2c2a0 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65  ents */.  fts5De
2c2b0 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20  codeRowid(iKey, 
2c2c0 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
2c2d0 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
2c2e0 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67  no);..  if( iSeg
2c2f0 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
2c300 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52   iKey==FTS5_AVER
2c310 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
2c320 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2c330 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2c340 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 61  f(pRc, pBuf, "{a
2c350 76 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20 20  verages} ");.   
2c360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2c370 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2c380 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2c390 20 70 42 75 66 2c 20 22 7b 73 74 72 75 63 74 75   pBuf, "{structu
2c3a0 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  re}");.    }.  }
2c3b0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
2c3c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2c3d0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2c3e0 70 42 75 66 2c 20 22 7b 25 73 73 65 67 69 64 3d  pBuf, "{%ssegid=
2c3f0 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d  %d h=%d pgno=%d}
2c400 22 2c 0a 20 20 20 20 20 20 20 20 62 44 6c 69 64  ",.        bDlid
2c410 78 20 3f 20 22 64 6c 69 64 78 20 22 20 3a 20 22  x ? "dlidx " : "
2c420 22 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  ", iSegid, iHeig
2c430 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b  ht, iPgno.    );
2c440 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
2c450 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
2c460 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
2c470 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2c480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2c490 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2c4a0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2c4b0 2a 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72  *pBuf,.  Fts5Str
2c4c0 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69  ucture *p.){.  i
2c4d0 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20  nt iLvl, iSeg;  
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c4f0 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
2c500 68 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e  h levels, segmen
2c510 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76  ts */..  for(iLv
2c520 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65  l=0; iLvl<p->nLe
2c530 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
2c540 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
2c550 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d  evel *pLvl = &p-
2c560 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
2c570 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2c580 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2c590 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
2c5a0 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e       " {lvl=%d n
2c5b0 4d 65 72 67 65 3d 25 64 20 6e 53 65 67 3d 25 64  Merge=%d nSeg=%d
2c5c0 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e  ", iLvl, pLvl->n
2c5d0 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65  Merge, pLvl->nSe
2c5e0 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72  g.    );.    for
2c5f0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
2c600 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
2c610 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
2c620 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2c630 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
2c640 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73  g[iSeg];.      s
2c650 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2c660 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2c670 2c 20 70 42 75 66 2c 20 22 20 7b 69 64 3d 25 64  , pBuf, " {id=%d
2c680 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22   leaves=%d..%d}"
2c690 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  , .          pSe
2c6a0 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d  g->iSegid, pSeg-
2c6b0 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67  >pgnoFirst, pSeg
2c6c0 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20  ->pgnoLast.     
2c6d0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
2c6e0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2c6f0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2c700 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d   pBuf, "}");.  }
2c710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
2c720 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74  s part of the ft
2c730 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75  s5_decode() debu
2c740 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a  gging aid..**.**
2c750 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62   Arguments pBlob
2c760 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61  /nBlob contain a
2c770 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73 35   serialized Fts5
2c780 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
2c790 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
2c7a0 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d  on appends a hum
2c7b0 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72  an-readable repr
2c7c0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2c7d0 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a  e same object.**
2c7e0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
2c7f0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2c800 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2c810 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2c820 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
2c830 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c850 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2c860 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2c870 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2c880 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
2c890 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
2c8a0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c8d0 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  de */.  Fts5Stru
2c8e0 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20  cture *p = 0;   
2c8f0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64          /* Decod
2c900 65 64 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  ed structure obj
2c910 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ect */..  rc = f
2c920 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
2c930 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  de(pBlob, nBlob,
2c940 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72   0, &p);.  if( r
2c950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c960 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
2c970 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
2c980 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63    fts5DebugStruc
2c990 74 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20  ture(pRc, pBuf, 
2c9a0 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
2c9b0 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d  ureRelease(p);.}
2c9c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2c9d0 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35  part of the fts5
2c9e0 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67  _decode() debugg
2c9f0 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41  ing aid..**.** A
2ca00 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e  rguments pBlob/n
2ca10 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20  Blob contain an 
2ca20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
2ca30 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2ca40 20 0a 2a 2a 20 61 70 70 65 6e 64 73 20 61 20 68   .** appends a h
2ca50 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65  uman-readable re
2ca60 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2ca70 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 62 75  record to the bu
2ca80 66 66 65 72 20 70 61 73 73 65 64 20 0a 2a 2a 20  ffer passed .** 
2ca90 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2caa0 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74  gument. .*/.stat
2cab0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2cac0 64 65 41 76 65 72 61 67 65 73 28 0a 20 20 69 6e  deAverages(.  in
2cad0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2caf0 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2cb00 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2cb10 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
2cb20 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
2cb30 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
2cb40 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20   i = 0;.  const 
2cb50 63 68 61 72 20 2a 7a 53 70 61 63 65 20 3d 20 22  char *zSpace = "
2cb60 22 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e  ";..  while( i<n
2cb70 42 6c 6f 62 20 29 7b 0a 20 20 20 20 75 36 34 20  Blob ){.    u64 
2cb80 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73  iVal;.    i += s
2cb90 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2cba0 69 6e 74 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26  int(&pBlob[i], &
2cbb0 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  iVal);.    sqlit
2cbc0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2cbd0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2cbe0 75 66 2c 20 22 25 73 25 64 22 2c 20 7a 53 70 61  uf, "%s%d", zSpa
2cbf0 63 65 2c 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a  ce, (int)iVal);.
2cc00 20 20 20 20 7a 53 70 61 63 65 20 3d 20 22 20 22      zSpace = " "
2cc10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
2cc20 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
2cc30 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
2cc40 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
2cc50 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
2cc60 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
2cc70 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
2cc80 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
2cc90 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
2cca0 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
2ccb0 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
2ccc0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2ccd0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
2cce0 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
2ccf0 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
2cd00 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2cd10 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2cd20 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2cd30 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
2cd40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2cd50 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
2cd60 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
2cd70 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
2cd80 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
2cd90 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
2cda0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2cdb0 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
2cdc0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2cdd0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2cde0 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
2cdf0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2ce00 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2ce10 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
2ce20 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
2ce30 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
2ce40 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
2ce50 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
2ce60 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
2ce70 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
2ce80 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
2ce90 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
2cea0 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
2ceb0 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
2cec0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
2ced0 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
2cee0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
2cef0 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
2cf00 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2cf10 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
2cf20 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
2cf30 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2cf40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2cf50 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
2cf60 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
2cf70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2cf80 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
2cf90 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
2cfa0 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
2cfb0 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
2cfc0 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30    i64 iDocid = 0
2cfd0 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  ;.  int iOff = 0
2cfe0 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  ;..  if( n>0 ){.
2cff0 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74      iOff = sqlit
2d000 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2d010 61 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64  a, (u64*)&iDocid
2d020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2d030 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2d040 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2d050 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63  " id=%lld", iDoc
2d060 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  id);.  }.  while
2d070 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2d080 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e  int nPos;.    in
2d090 74 20 62 44 65 6c 3b 0a 20 20 20 20 69 4f 66 66  t bDel;.    iOff
2d0a0 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
2d0b0 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c  stSize(&a[iOff],
2d0c0 20 26 6e 50 6f 73 2c 20 26 62 44 65 6c 29 3b 0a   &nPos, &bDel);.
2d0d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2d0e0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2d0f0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 6e  f(pRc, pBuf, " n
2d100 50 6f 73 3d 25 64 25 73 22 2c 20 6e 50 6f 73 2c  Pos=%d%s", nPos,
2d110 20 62 44 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20   bDel?"*":"");. 
2d120 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
2d130 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63  ecodePoslist(pRc
2d140 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d  , pBuf, &a[iOff]
2d150 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50  , MIN(n-iOff, nP
2d160 6f 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f  os));.    if( iO
2d170 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36  ff<n ){.      i6
2d180 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
2d190 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
2d1a0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
2d1b0 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
2d1c0 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 44 6f  elta);.      iDo
2d1d0 63 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  cid += iDelta;. 
2d1e0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2d1f0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2d200 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2d210 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64  id=%lld", iDocid
2d220 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2d230 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a  return iOff;.}..
2d240 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2d250 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2d260 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2d270 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65  function fts5_de
2d280 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
2d290 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2d2a0 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  eFunction(.  sql
2d2b0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2d2c0 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
2d2d0 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f  Function call co
2d2e0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
2d2f0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
2d300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2d310 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c  mber of args (al
2d320 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c  ways 2) */.  sql
2d330 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
2d340 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
2d350 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  Function argumen
2d360 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69  ts */.){.  i64 i
2d370 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
2d380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2d390 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62  wid for record b
2d3a0 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
2d3b0 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65    int iSegid,iHe
2d3c0 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64  ight,iPgno,bDlid
2d3d0 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f  x;/* Rowid compo
2d3e0 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  nents */.  const
2d3f0 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20   u8 *aBlob; int 
2d400 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  n;         /* Re
2d410 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a  cord to decode *
2d420 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20  /.  u8 *a = 0;. 
2d430 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20   Fts5Buffer s;  
2d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d450 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78   /* Build up tex
2d460 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65  t to return here
2d470 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2d480 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d490 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d4a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  code */.  int nS
2d4b0 70 61 63 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  pace = 0;..  ass
2d4c0 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a  ert( nArg==2 );.
2d4d0 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
2d4e0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
2d4f0 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20  r));.  iRowid = 
2d500 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2d510 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a  t64(apVal[0]);..
2d520 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
2d530 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
2d540 72 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29  rgument (a blob)
2d550 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65   in aBlob[]. The
2d560 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f   aBlob[].  ** co
2d570 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62  py is followed b
2d580 79 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  y FTS5_DATA_ZERO
2d590 5f 50 41 44 44 49 4e 47 20 30 78 30 30 20 62 79  _PADDING 0x00 by
2d5a0 74 65 73 2c 20 77 68 69 63 68 20 70 72 65 76 65  tes, which preve
2d5b0 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  nts.  ** buffer 
2d5c0 6f 76 65 72 72 65 61 64 73 20 65 76 65 6e 20 69  overreads even i
2d5d0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2d5e0 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e  corrupt.  */.  n
2d5f0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2d600 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29  _bytes(apVal[1])
2d610 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  aBlob = sqli
2d620 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
2d630 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61  pVal[1]);.  nSpa
2d640 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41  ce = n + FTS5_DA
2d650 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b  TA_ZERO_PADDING;
2d660 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69  .  a = (u8*)sqli
2d670 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
2d680 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a  o(&rc, nSpace);.
2d690 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74    if( a==0 ) got
2d6a0 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
2d6b0 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c  memcpy(a, aBlob,
2d6c0 20 6e 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63   n);...  fts5Dec
2d6d0 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c  odeRowid(iRowid,
2d6e0 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64   &iSegid, &bDlid
2d6f0 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50  x, &iHeight, &iP
2d700 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62  gno);..  fts5Deb
2d710 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c  ugRowid(&rc, &s,
2d720 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20   iRowid);.  if( 
2d730 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74  bDlidx ){.    Ft
2d740 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20  s5Data dlidx;.  
2d750 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c    Fts5DlidxLvl l
2d760 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70  vl;..    dlidx.p
2d770 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e   = a;.    dlidx.
2d780 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d  nn = n;..    mem
2d790 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a  set(&lvl, 0, siz
2d7a0 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
2d7b0 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74  ));.    lvl.pDat
2d7c0 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20  a = &dlidx;.    
2d7d0 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  lvl.iLeafPgno = 
2d7e0 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28  iPgno;..    for(
2d7f0 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
2d800 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66  (&lvl); lvl.bEof
2d810 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76  ==0; fts5DlidxLv
2d820 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20  lNext(&lvl)){.  
2d830 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2d840 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2d850 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20  f(&rc, &s, .    
2d860 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29        " %d(%lld)
2d870 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f  ", lvl.iLeafPgno
2d880 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20  , lvl.iRowid.   
2d890 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
2d8a0 6c 73 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d  lse if( iSegid==
2d8b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f  0 ){.    if( iRo
2d8c0 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47  wid==FTS5_AVERAG
2d8d0 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  ES_ROWID ){.    
2d8e0 20 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72    fts5DecodeAver
2d8f0 61 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c  ages(&rc, &s, a,
2d900 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2d910 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65        fts5Decode
2d920 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
2d930 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  s, a, n);.    }.
2d940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
2d950 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
2d960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2d970 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20  rrent term read 
2d980 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20  from page */.   
2d990 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20   int szLeaf;    
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d9b0 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64  * Offset of pgid
2d9c0 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20  x in a[] */.    
2d9d0 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20  int iPgidxOff;. 
2d9e0 20 20 20 69 6e 74 20 69 50 67 69 64 78 50 72 65     int iPgidxPre
2d9f0 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
2da00 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
2da10 75 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69  ue read from pgi
2da20 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54  dx */.    int iT
2da30 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  ermOff = 0;.    
2da40 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20  int iRowidOff = 
2da50 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  0;.    int iOff;
2da60 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  .    int nDoclis
2da70 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t;..    memset(&
2da80 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
2da90 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
2daa0 20 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20     if( n<4 ){.  
2dab0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2dac0 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26 73  ufferSet(&rc, &s
2dad0 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , 7, (const u8*)
2dae0 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20  "corrupt");.    
2daf0 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75    goto decode_ou
2db00 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2db10 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
2db20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d  fts5GetU16(&a[0]
2db30 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f  );.      iPgidxO
2db40 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74  ff = szLeaf = ft
2db50 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b  s5GetU16(&a[2]);
2db60 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64  .      if( iPgid
2db70 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  xOff<n ){.      
2db80 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33    fts5GetVarint3
2db90 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
2dba0 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20   iTermOff);.    
2dbb0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2dbc0 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73  * Decode the pos
2dbd0 69 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20  ition list tail 
2dbe0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2dbf0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
2dc00 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30  if( iRowidOff!=0
2dc10 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d   ){.      iOff =
2dc20 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
2dc30 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
2dc40 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ff!=0 ){.      i
2dc50 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
2dc60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dc70 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a   iOff = szLeaf;.
2dc80 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65      }.    fts5De
2dc90 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c  codePoslist(&rc,
2dca0 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66   &s, &a[4], iOff
2dcb0 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  -4);..    /* Dec
2dcc0 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63  ode any more doc
2dcd0 6c 69 73 74 20 64 61 74 61 20 74 68 61 74 20 61  list data that a
2dce0 70 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61  ppears on the pa
2dcf0 67 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ge before the.  
2dd00 20 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e    ** first term.
2dd10 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74   */.    nDoclist
2dd20 20 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69   = (iTermOff ? i
2dd30 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66  TermOff : szLeaf
2dd40 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74  ) - iOff;.    ft
2dd50 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
2dd60 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
2dd70 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20  ], nDoclist);.. 
2dd80 20 20 20 77 68 69 6c 65 28 20 69 50 67 69 64 78     while( iPgidx
2dd90 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  Off<n ){.      i
2dda0 6e 74 20 62 46 69 72 73 74 20 3d 20 28 69 50 67  nt bFirst = (iPg
2ddb0 69 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b  idxOff==szLeaf);
2ddc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2ddd0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70   first term on p
2dde0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  age */.      int
2ddf0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64     /* Bytes of d
2de20 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ata */.      int
2de30 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20   iEnd;.      .  
2de40 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
2de50 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2de60 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
2de70 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50  nByte);.      iP
2de80 67 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74  gidxPrev += nByt
2de90 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  e;.      iOff = 
2dea0 69 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20  iPgidxPrev;..   
2deb0 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66     if( iPgidxOff
2dec0 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  <n ){.        ft
2ded0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
2dee0 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79  [iPgidxOff], nBy
2def0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e  te);.        iEn
2df00 64 20 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b  d = iPgidxPrev +
2df10 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65   nByte;.      }e
2df20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e  lse{.        iEn
2df30 64 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  d = szLeaf;.    
2df40 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62    }..      if( b
2df50 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
2df60 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2df70 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2df80 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2df90 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e        term.n = n
2dfa0 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Byte;.      }.  
2dfb0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2dfc0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2dfd0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2dfe0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
2dff0 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74  pendBlob(&rc, &t
2e000 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69  erm, nByte, &a[i
2e010 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66  Off]);.      iOf
2e020 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20  f += nByte;..   
2e030 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2e040 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2e050 28 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c  (.          &rc,
2e060 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73   &s, " term=%.*s
2e070 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73  ", term.n, (cons
2e080 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20  t char*)term.p. 
2e090 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f       );.      iO
2e0a0 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
2e0b0 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Doclist(&rc, &s,
2e0c0 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d   &a[iOff], iEnd-
2e0d0 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iOff);.    }..  
2e0e0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
2e0f0 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a  (&term);.  }.  .
2e100 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73   decode_out:.  s
2e110 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
2e120 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e130 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2e140 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
2e150 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  Ctx, (const char
2e160 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49  *)s.p, s.n, SQLI
2e170 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
2e180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
2e190 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2e1a0 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
2e1b0 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
2e1c0 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a  rFree(&s);.}../*
2e1d0 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
2e1e0 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
2e1f0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2e200 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69  nction fts5_rowi
2e210 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
2e220 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e  oid fts5RowidFun
2e230 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
2e240 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2e250 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2e260 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
2e270 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e290 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e2a0 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
2e2b0 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
2e2c0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
2e2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2e2e0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
2e2f0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
2e300 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e  r *zArg;.  if( n
2e310 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Arg==0 ){.    sq
2e320 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2e330 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64  or(pCtx, "should
2e340 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
2e350 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c  subject, ....)",
2e360 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   -1);.  }else{. 
2e370 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74     zArg = (const
2e380 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
2e390 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
2e3a0 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0]);.    if( 0==
2e3b0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2e3c0 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29  zArg, "segment")
2e3d0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
2e3e0 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  owid;.      int 
2e3f0 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20  segid, pgno;.   
2e400 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29     if( nArg!=3 )
2e410 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e420 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
2e430 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Ctx, .          
2e440 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74    "should be: ft
2e450 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e  s5_rowid('segmen
2e460 74 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29  t', segid, pgno)
2e470 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29  )", -1.        )
2e480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e490 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73         segid = s
2e4a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2e4b0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20  (apVal[1]);.    
2e4c0 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74      pgno = sqlit
2e4d0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
2e4e0 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[2]);.        
2e4f0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
2e500 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69  GMENT_ROWID(segi
2e510 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  d, pgno);.      
2e520 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2e530 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f  _int64(pCtx, iRo
2e540 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wid);.      }.  
2e550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2e560 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2e570 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
2e580 20 20 20 22 66 69 72 73 74 20 61 72 67 20 74 6f     "first arg to
2e590 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75   fts5_rowid() mu
2e5a0 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22  st be 'segment'"
2e5b0 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20   , -1.      );. 
2e5c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2e5d0 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
2e5e0 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69   as part of regi
2e5f0 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35  stering the FTS5
2e600 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74   module with dat
2e610 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
2e620 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73  ion db. It regis
2e630 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65  ters several use
2e640 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
2e650 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75   functions usefu
2e660 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a  l.** with FTS5..
2e670 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2e680 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2e690 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2e6a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2e6b0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51  some other.** SQ
2e6c0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
2e6d0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
2e6e0 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ead..*/.int sqli
2e6f0 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
2e700 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
2e710 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2e720 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2e730 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74  n(.      db, "ft
2e740 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53  s5_decode", 2, S
2e750 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
2e760 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
2e770 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  n, 0, 0.  );.  i
2e780 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e790 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2e7a0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2e7b0 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
2e7c0 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20  , "fts5_rowid", 
2e7d0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
2e7e0 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e   0, fts5RowidFun
2e7f0 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
2e800 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2e810 72 63 3b 0a 7d 0a 0a                             rc;.}..